【问题标题】: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 足够聪明,可以只做需要做的事情。一旦找到任何记录,它就会停止。这就是它的目的。

标签: mysql query-optimization exists sql-limit


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

【讨论】:

    猜你喜欢
    • 2011-04-20
    • 1970-01-01
    • 1970-01-01
    • 2011-09-21
    • 2020-08-22
    • 2012-02-03
    • 2011-03-03
    • 1970-01-01
    • 2022-01-17
    相关资源
    最近更新 更多