SQL多表关联写法性能对比:子查询先过滤还是关联后WHERE过滤更快
两种SQL查询写法性能对比
参考写法
第一种:子查询先过滤再关联
SELECT * FROM (SELECT * FROM A WHERE col1 = 1) A JOIN (SELECT * FROM B WHERE col2 = 2) B ON A.ID = B.ID
第二种:关联后统一加过滤条件
SELECT * FROM A JOIN B ON A.ID = B.ID WHERE A.col1 = 1 AND B.col2 = 2
核心结论
- 所有主流现代关系型数据库(MySQL 5.6+、PostgreSQL、Oracle、SQL Server等)中,这两种写法性能完全一致,没有差异。
- 仅在极特殊场景下第一种写法性能更差。
具体说明
现在的数据库查询优化器已经非常智能,支持谓词下推、SQL逻辑自动改写:第一种写法里子查询的过滤条件会被优化器直接下推到关联操作之前执行,最终生成的执行计划和第二种写法完全相同,不会产生额外的临时表开销、全表扫描开销。
只有两种情况会出现性能差异:
- 使用的是非常老旧、优化器逻辑不完善的数据库版本,无法自动改写子查询逻辑,会先将子查询结果存入临时表再做关联,此时第一种写法性能更差
- 子查询中包含
LIMIT、聚合函数、窗口函数等特殊语法,优化器无法做下推改写,此时两种写法的执行逻辑本身就有差异,性能没有可比性
写法推荐
从可读性、可维护性角度更推荐第二种写法,逻辑更直观,后续调整过滤条件、关联规则的成本更低。
内容的提问来源于stack exchange,提问作者4s14n n3rd
相关产品推荐
相关产品推荐

