在 EXISTS 查询中使用 LIMIT 有什么意义吗?
Any point in using LIMIT in EXISTS query?
将 LIMIT
添加到 EXISTS
查询是否有任何性能优势,或者 MySQL 会自行应用限制?
示例:
IF EXISTS (
SELECT 1
FROM my_table
LIMIT 1 -- can this improve performance?
)
THEN ... END IF;
稍微摆弄一下我的查询,我注意到如果 LIMIT
设置为 0,EXISTS
仍然是 returns 1。我认为这表明它被忽略了。
这取决于您的 table(my_table) 中有多少条记录。如果记录不是太多,那么您不会看到任何性能改进,但如果您的 table 太多了很多记录然后你会看到性能改进,但这也取决于许多因素,因为你在 select 中使用的列中有索引(如果你这样做,那么你将获得覆盖索引的好处也)。
EXISTS()
的目的是执行查询 直到 它可以决定是否有 any 行table 匹配 WHERE
子句。也就是说,它在逻辑上与 LIMIT 1
做同样的事情。 EXISTS
在某些圈子里可能被称为semi-join
。
底线:不要在 EXISTS()
.
中使用 LIMIT 1
附录:正如 Paul 指出的那样,LIMIT
和 和 OFFSET
(或 LIMIT m,n
)确实有意义。
将 LIMIT
添加到 EXISTS
查询是否有任何性能优势,或者 MySQL 会自行应用限制?
示例:
IF EXISTS (
SELECT 1
FROM my_table
LIMIT 1 -- can this improve performance?
)
THEN ... END IF;
稍微摆弄一下我的查询,我注意到如果 LIMIT
设置为 0,EXISTS
仍然是 returns 1。我认为这表明它被忽略了。
这取决于您的 table(my_table) 中有多少条记录。如果记录不是太多,那么您不会看到任何性能改进,但如果您的 table 太多了很多记录然后你会看到性能改进,但这也取决于许多因素,因为你在 select 中使用的列中有索引(如果你这样做,那么你将获得覆盖索引的好处也)。
EXISTS()
的目的是执行查询 直到 它可以决定是否有 any 行table 匹配 WHERE
子句。也就是说,它在逻辑上与 LIMIT 1
做同样的事情。 EXISTS
在某些圈子里可能被称为semi-join
。
底线:不要在 EXISTS()
.
LIMIT 1
附录:正如 Paul 指出的那样,LIMIT
和 和 OFFSET
(或 LIMIT m,n
)确实有意义。