在日常优化过程中,发现一个怪事情,同一个SQL出现两个完全不一样执行计划,left join 连驱动表都可以变成不一样。
对于left join,如果where条件里有被关联表过滤,left join有可能被转成inner join ,本案例中shopInfo有ShopCategory = 'LOC'过滤条件; 保证shopInfo的记录非NULL,因此left join在优化过程中可以转为inner join。 那么O和S的JOIN顺序就是可以交换的。
验证结论:
创建表:
--班级表
CREATE TABLE T_CLASS(
class_id int not null,
class_name VARCHAR2(100)
);
添加索引
alter table T_CLASS add index inx_class_id(class_id);
--学生表
CRE

在SQL优化中,发现LEFT JOIN在特定条件下可能转换为INNER JOIN。当LEFT JOIN的被关联表(如shopInfo)在WHERE子句中有非NULL过滤条件(如ShopCategory = 'LOC'),优化器认为结果不会包含NULL,从而转为INNER JOIN。通过创建不同场景的测试表,验证了只有被关联表有有效过滤条件时,MySQL才会进行这种转换。
最低0.47元/天 解锁文章
570

被折叠的 条评论
为什么被折叠?



