mysql limit导致索引选择(选择的并不是最佳索引)的处理方案
昨天公司APP项目上线时遇到一个奇葩问题,在这里简单做一个记录,以避免如果再遇到类似问题再去花费时间寻找解决方案。
首先贴出cp_orders表中建立的索引
使用限制符limit时,mysql使用了idx_order_type索引,扫描了46w行
没有使用限制符limit时,mysql使用了idx_agent_order_type索引(联合索引),扫描了9k行
解决方案:
1.order by a.`code`+0 DESC,mysql会使用idx_agent_order_type索引
2.cp_orders a FORCE INDEX(idx_agent_order_type),强制使用idx_agent_order_type索引
3.延迟关联查询
问题追踪:
1.cp_orders表索引过多
2.mysql优化器内部bug(详细请参阅:https://yq.aliyun.com/articles/51065)
bug 触发条件如下:
- 优化器先选择了 where 条件中字段的索引,该索引过滤性较好;
- SQL 中必须有 order by limit 从而引导优化器尝试使用 order by 字段上的索引进行优化,最终因代价问题没有成功。