在日常优化过程中,发现一个怪事情,同一个SQL出现两个完全不一样执行计划,left join 连驱动表都可以变成不一样。 对于left join,如果where条件里有被关联表过滤,left join有可能被转成inner join ,本案例中shopInfo有ShopCategory = LOC过滤条件; 保证s
在日常优化过程中,发现一个怪事情,同一个SQL出现两个完全不一样执行计划,left join 连驱动表都可以变成不一样。
对于left join,如果where条件里有被关联表过滤,left join有可能被转成inner join ,本案例中shopInfo有ShopCategory = 'LOC'过滤条件; 保证shopInfo的记录非NULL,因此left join在优化过程中可以转为inner join。 那么O和S的JOIN顺序就是可以交换的。 验证结论: 创建表:
案例1:B表有where条件且不为null
案例2: A表和B表均有where条件且不为null
案例3:A表和B表均有where条件且不为null,删除B表索引
结论: left join 只有被关联表有where条件,且其过滤条件优于关联表的情况下,mysql优化器才转成inner join. |
2021-06-02
2021-06-05
2022-06-27
2022-10-12
2019-09-11