mysql limit导致索引选择(选择的并不是最佳索引)案例分析:
这种情况可能是mysql优化器内部bug造成:
bug 触发条件如下:
1.优化器先选择了 where 条件中字段的索引,该索引过滤性较好;
2.SQL 中必须有 order by limit 从而引导优化器尝试使用 order by 字段上的索引进行优化,最终因代价问题没有成功。
举例说明:
触发bug的SQL:
上面的sql 由于使用了order by id limit 操作,mysql优化器尝试使用 order by 字段上的索引进行优化,最终因代价问题没有成功。也就是上面看到的执行计划里,虽然选择了id这个索引,但是Extra 还是Using where
使用 force index 可以选择过滤性好的索引
最终对比执行效果:
优化前:
优化后: