SQL JOIN多表查询最佳实践:两种关联写法哪种执行效率更高?
两种SQL查询的性能对比结论
问题复现
对比以下两种关联查询写法的运行效率:
写法1
SELECT A.column1, B.column2, C.column3 FROM TableA A INNER JOIN TableB B ON B.id = A.id INNER JOIN TableC C ON C.id = A.id WHERE A.ID = ....
写法2
SELECT A.id, A.column1, B.column2, C.column3 FROM TableA A INNER JOIN (SELECT id, column2 FROM TableB) B ON B.id = A.id INNER JOIN (SELECT id, column3 FROM TableC) C ON C.id = A.id WHERE A.ID = ....
最终结论
绝大多数主流关系型数据库(MySQL、PostgreSQL、Oracle、SQL Server等)场景下,写法1的性能不会弱于写法2,大部分情况两者执行效率完全一致,部分特殊场景下写法2反而更慢。
原因说明
- 现在的成熟数据库都自带查询优化器,内置「投影下推」能力:就算你用写法1直接关联整表,优化器也会自动识别你只需要用到B表的id、column2和C表的id、column3,执行时只会提取这几个需要的字段,不会把整表的所有字段都拉取出来做关联,两者生成的执行计划几乎没有区别。
- 写法2的自定义子查询反而可能带来额外开销:一方面优化器解析子查询需要多一步计算成本,虽然开销极低可以忽略;另一方面如果是更复杂的查询场景,子查询里带有聚合、LIMIT、函数运算等无法下推的逻辑时,优化器可能会先把子查询的全量结果做成临时表再关联,性能会大幅下降。
- 额外提一句:如果你的业务不需要返回A表的id字段,写法2多查了一个无用字段,属于多余操作,虽然对性能影响极小,但完全没必要。
使用建议
日常开发优先选写法1的语法,可读性更高,也不会额外增加优化器的判断负担,字段裁剪的工作直接交给数据库优化器处理即可,不需要手动写子查询做这类操作。
内容的提问来源于stack exchange,提问作者Lisa
相关产品推荐
相关产品推荐

