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)
如果您有良好的索引并最终使用它们,这可能会更有效。但同样,你应该测量。
在两个子查询(或 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)
如果您有良好的索引并最终使用它们,这可能会更有效。但同样,你应该测量。