问题2----由避免排序走的低效率索引

127 阅读1分钟

[toc]

关键信息 (1)SQL出现多种条件查询并且需要排序 (2)执行器未选取正确索引

问题描述

自动化用例接口报错,排查报错原因。

问题排查

(1)观察日志

观察请求链路,发现SQL查询超时,如下所示

查询超时.png

结论----SQL查询过慢,需要排查SQL

(2)SQL分析

使用explain查看SQL简单的执行计划,发现执行了索引

explainSQL.png

注意,当时以为该SQL走了索引不算慢SQL,去排查其他问题了,但是最后发现不是这样的

分析发现,该条SQL存在多个条件字段查询,并且在最后使用另一个字段X进行排序。查看执行计划可以发现,MySQL为了避免排序,使用字段X的索引 进行查询,对于每条记录去主键索引进行匹配,直到取完限定行数结束。

由于匹配条件命中率较低,该查询效率较低(实际中执行平均10s,感觉和全表差不多)。

结论----MySQL为了避免进行排序,使用排序字段作为索引,但是由于SQL存在多种查询条件。低效率的索引导致了慢查询。

解决方法

分析了该多条件查询的SQL的查询场景,发现其中存在一个时间参数必须传递,向产品确认是否可以按照此参数排序,得到肯定的答复后,按照该 字段进行排序即可。优化后查询时间直接变为ms级。