【问题标题】:Performance in mysql joins with subquery and limitmysql 中的性能与子查询和限制相结合
【发布时间】:2016-07-09 02:54:06
【问题描述】:

在两个子查询(或一个表和一个子查询)之间的连接操作中,最好在内部查询中指定 LIMIT 子句而不是在外部查询中指定(因为顺序将决定 DBMS 将必须迭代检查 where 子句)?喜欢:

(( SELECT id FROM Table1 WHERE score>=100 LIMIT 10) AS A NATURAL JOIN Table2 ))

会比

(( SELECT id FROM Table1 WHERE score>=100) AS A NATURAL JOIN Table2 )) LIMIT 10

我的想法是,在最后一个查询中,DBMS 首先必须迭代(全表或索引)Table1 中 score>=100 的所有行,这些行可以在它们的公共列上映射到 Table2(可以是任何数字行),只有在这之后它才会截断到只有 10 行,而在第一个查询中,它只会扫描到从 Table1 中找到满足 where 子句并且可以映射到 Table2 的 10 行,然后停止.. ..

【问题讨论】:

    标签: mysql subquery limits


    【解决方案1】:

    这两个部分语句不等价。使用LIMIT 时,订单很重要。如果您将限制设置在 Table1 上,您可能永远看不到在整个数据集上设置限制时会看到的行。鉴于该免责声明,似乎使用限制然后加入会更有效,但经验法则是您应该始终衡量。

    还请考虑,而不是将SELECT 作为表加入,MySQL 必须为其构建一个内部临时表,您可以加入表本身,即:

    SELECT t0.col0, t1.col1
    FROM
        Table0 t0
        JOIN Table1 t1 ON (t0.col0 = t1.col0 AND t1.score >= 100)
    

    如果您有良好的索引并最终使用它们,这可能会更有效。但同样,您应该测量。

    【讨论】:

      猜你喜欢
      • 2013-09-12
      • 1970-01-01
      • 2021-04-18
      • 1970-01-01
      • 2023-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-20
      相关资源
      最近更新 更多