将过滤器放在 JOIN 子句而不是 WHERE 子句上是否更好

nas*_*off 7 mysql join

MySQL 5.5.8:

问题 1:
以下陈述是否有任何不同,如果有,哪一个是首选的性能明智的?甚至可以在不知道 where 子句前后表的行数以及可能的索引用法的情况下回答这个问题吗?

SELECT *
FROM a JOIN b ON a.id = b.id AND a.col2 BETWEEN 1 AND 5;

SELECT *
FROM a JOIN b ON a.id = b.id
WHERE a.col2 BETWEEN 1 AND 5;
Run Code Online (Sandbox Code Playgroud)

我问的原因是因为例如,如果表很大,但 where 子句过滤掉了 99.9999% 的记录,如果在连接后 99.9999% 的记录没有被使用,我不想浪费时间连接大量表。

问题2:

采取相同的情况,哪个语句(如果有任何不同)需要更少的 IOPS。(索引出现在 b.id 上,一个出现在 a.col2 上)

Dav*_*ett 11

对于所有连接都是内部连接的查询(正如您的在这里,除非另有指定连接默认为内部连接),使用任何好的查询计划器(并且 IIRC mysql 在这方面就足够好了),无论您是放置过滤还是在 ON 子句或 WHERE 中加入比较。

在存在外连接的情况下,更复杂的查询不太清楚,因为过滤子句的位置可以(但并不总是)根据输入数据产生显着影响。

为了说服自己,请生成一个大数据集并尝试两者以查看是否有任何区别。作为一项学习练习,可以很好地了解您选择的数据库引擎中的优化可以做什么和不能做什么,很少有一些经过深思熟虑的实验、监控和基准测试。