MySQL order by + limit bug 触发原因及解决办法

102 total views, 6 views today

问题描述

下面这个SQL,应该走where的索引 idx_iv_pid,包含 id_value 、parent_id 两列。
但是,走的是排序列 add_time的索引add_time_idx。从而SQL执行速度慢。
但是,但是! add_time_idx 并不在“possible_keys”里。

SQL真实执行时间为 1202ms 。
后来查到,这是一个bug。

bug触发条件

1、where条件中的索引过滤性较好
2、order by + limit 引导优化器尝试使用 order by上的索引进行优化,最总选择错了成本更高的order by索引。
这个优化器选择路径的过程,可以使用 optimizer_trace方式获取

1、打开优化器追踪

2、执行SQL

3、查看追踪数据

范围访问总结部分,显示选择了cost最低的idx_iv_pid索引。

但是在“reconsidering_access_paths_for_index_ordering” 重新选择排序路径的时候选择了 order by列上的索引add_time_idx。
从而导致了走了错误的执行计划。

解决办法

在order by中加入主键列 comment_id 就能正常的走where条件的索引 idx_iv_pid(id_value,parent_id)

SQL 真实执行时间 74ms,快了将近20倍。

参考

https://developer.aliyun.com/article/51065

发表评论

必填项已用*标注