mysql limit导致索引选择(选择的并不是最佳索引)的处理方案

昨天公司APP项目上线时遇到一个奇葩问题,在这里简单做一个记录,以避免如果再遇到类似问题再去花费时间寻找解决方案。

首先贴出cp_orders表中建立的索引

mysql limit导致索引选择(选择的并不是最佳索引)的处理方案_第1张图片

使用限制符limit时,mysql使用了idx_order_type索引,扫描了46w行

mysql limit导致索引选择(选择的并不是最佳索引)的处理方案_第2张图片

没有使用限制符limit时,mysql使用了idx_agent_order_type索引(联合索引),扫描了9k行

mysql limit导致索引选择(选择的并不是最佳索引)的处理方案_第3张图片

解决方案:

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 触发条件如下:

  1. 优化器先选择了 where 条件中字段的索引,该索引过滤性较好;
  2. SQL 中必须有 order by limit 从而引导优化器尝试使用 order by 字段上的索引进行优化,最终因代价问题没有成功。

你可能感兴趣的:(开发)