在 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
with 和 OFFSET
(或 LIMIT m,n
)确实有意义。
【讨论】:
LIMIT 似乎在 EXISTS 子查询中被忽略。但是,如果你想定义一个偏移量,当你想检查是否至少存在 N 行时,你会需要它。【参考方案2】:稍微摆弄一下我的查询,我注意到如果 LIMIT
设置为 0,EXISTS
仍然返回 1。我认为这表明它被忽略了。
【讨论】:
我建议LIMIT 0
是一个异常的边缘情况。
这是一个概念验证案例【参考方案3】:
这取决于你的表中有多少记录(my_table)。如果记录不是太多,那么你不会看到任何性能改进,但如果你的表有太多记录,那么你会看到性能改进,但这也取决于在许多因素上,您在选择中使用的列中有索引(如果您这样做,那么您还将获得覆盖索引的好处)。
【讨论】:
以上是关于在 EXISTS 查询中使用 LIMIT 有啥意义吗?的主要内容,如果未能解决你的问题,请参考以下文章
update 后面带exists的作用是啥?不带的话,有啥区别?