mysql 中的性能与子查询和限制连接

Performance in mysql joins with subquery and limit

在两个子查询(或 table 和子查询)之间的连接操作中,最好在内部查询而不是外部查询中指定 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 首先必须迭代(完整 table 或索引)表 1 中分数>=100 的所有行,这些行可以在其公共列上映射到表 2 (可以是任意数量的行),只有在那之后它才会截断到只有 10 行,而在第一个查询中,它只会扫描直到从 Table1 中找到 10 行满足 where 子句并且可以映射到Table2,那就停....

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

还考虑加入 SELECT 作为 table,MySQL 将不得不构建一个内部临时 table,您可以加入 table 本身,即:

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

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