在 EXISTS 查询中使用 LIMIT 有啥意义吗?

Posted

技术标签:

【中文标题】在 EXISTS 查询中使用 LIMIT 有啥意义吗?【英文标题】:Any point in using LIMIT in EXISTS query?在 EXISTS 查询中使用 LIMIT 有什么意义吗? 【发布时间】:2016-04-17 23:36:30 【问题描述】:

LIMIT 添加到EXISTS 查询是否有任何性能优势,或者mysql 会自行应用限制?

例子:

IF EXISTS (
    SELECT 1
      FROM my_table
     LIMIT 1    -- can this improve performance?
)
THEN ... END IF;

【问题讨论】:

是的...这会提高性能,因为您限制了记录。 你试过EXPLAIN吗? @TimBiegeleisen,是的,它似乎没有受到影响。 @TimBiegeleisen,my_table 中有很多行,如果这就是你的意思。 @AbhishekGinani 我不这么认为。 SQL 足够聪明,可以只做需要做的事情。一旦找到任何记录,它就会停止。这就是它的目的。 【参考方案1】:

EXISTS() 的目的是执行查询直到它可以确定该表中是否有 任何 行匹配WHERE 子句。也就是说,它在逻辑上与LIMIT 1 做同样的事情。 EXISTS 在某些圈子里可能被称为semi-join

底线:不要在EXISTS() 中使用LIMIT 1

附录:正如 Paul 指出的那样,LIMIT withOFFSET(或 LIMIT m,n)确实有意义。

【讨论】:

LIMIT 似乎在 EXISTS 子查询中被忽略。但是,如果你想定义一个偏移量,当你想检查是否至少存在 N 行时,你会需要它。【参考方案2】:

稍微摆弄一下我的查询,我注意到如果 LIMIT 设置为 0,EXISTS 仍然返回 1。我认为这表明它被忽略了。

【讨论】:

我建议LIMIT 0 是一个异常的边缘情况。 这是一个概念验证案例【参考方案3】:

这取决于你的表中有多少记录(my_table)。如果记录不是太多,那么你不会看到任何性能改进,但如果你的表有太多记录,那么你会看到性能改进,但这也取决于在许多因素上,您在选择中使用的列中有索引(如果您这样做,那么您还将获得覆盖索引的好处)。

【讨论】:

以上是关于在 EXISTS 查询中使用 LIMIT 有啥意义吗?的主要内容,如果未能解决你的问题,请参考以下文章

数据库中IN 和EXISTS有啥区别?

update 后面带exists的作用是啥?不带的话,有啥区别?

使用EXISTS语句注意点

如何优化limit

MySQL中的limit vs exists vs count(*) vs count(id) [重复]

对 MySQL LIMIT 使用负值有啥作用?