外键为NULL时MySQL JOIN性能及冗余关联优化问题
MySQL 冗余关联优化相关问题解答
核心结论
MySQL 没有针对「关联字段为NULL」的场景做自动移除冗余JOIN的优化,这类无意义的关联建议根据业务需求手动移除。
具体说明
- 首先需要区分关联类型的差异:
- 若使用
INNER JOIN Cars ON Person.carId = Cars.id:carId为NULL的Person行本身就会被关联逻辑过滤,不存在单条数据冗余关联的问题;如果你的业务需要保留无车的Person行,本身就不会选用INNER JOIN的关联方式。 - 若使用
LEFT JOIN Cars ON Person.carId = Cars.id:就算某行Person数据的carId为NULL,MySQL的执行计划依然会执行Cars表的关联检索逻辑,不会因为单条数据的关联值为空就跳过关联,更不会直接把整个Cars表的关联从执行计划中移除。
- 若使用
- 手动移除冗余关联的收益明确:
只要你的查询不需要用到Cars表的任何字段,也不需要通过Cars表的条件做数据过滤,不管关联字段是否存在NULL值,都可以直接删除这个JOIN逻辑。比如下面的查询:
去掉Cars表的关联后,查询结果完全一致,还减少了表关联的开销,Cars表数据量越大性能提升越明显。-- 原冗余查询 SELECT Person.id, Cities.city_name FROM Person LEFT JOIN Cities ON Person.cityId = Cities.id LEFT JOIN Cars ON Person.carId = Cars.id WHERE Person.id = 1001; - 注意:如果JOIN本身是用来做过滤的,比如需求是查询「有车的用户的城市信息」,就算你不需要返回Cars表的字段,
INNER JOIN Cars也不属于冗余关联,不能直接删除。
内容的提问来源于stack exchange,提问作者user3712353
相关产品推荐
相关产品推荐

