背景:最近负责的招聘系统出现了一些慢查询,已经解决了不少,但是还有,今天报了一个慢查询,咨询了下dba,可以加前缀索引优化。
出问题的sql:select * from t_offer_record where record_bill_hashcode = ?
执行时间:336ms
我这边按一般排查套路走了一遍,这里简单演示一下
- 看sql是否复杂
- 看sql查询了多少字段
- 看sql关联了几张表
- 看sql的查询条件
前面几步肉眼可以分析得到结论和大概的切入点 - 看sql查的表数据量有多少(实操)
select count(*) from t_offer_record //2.5w条 - 看sql查的表上的索引情况(实操)
show index from t_offer_record //只有主键索引 - 看sql查的表有多少字段(实操)
desc t_offer_record //可选操作,字段数25左右
这几步进一步分析了相关查询的表的一些情况,然后结合sql本身和查询的业务上下文即可知道大概的优化方案。我这里先跟dba沟通了这个case,dba说可以加前缀索引,但是之前没有学过,这次专门搜了下。
参考:https://blog.csdn.net/A_Runner/article/details/80207543
这里先问了下dba,我的数据是这样的,如下图:
数据内容.png
按照上面博客中的步骤和思路,我们执行一下sql看一下索引的选择性和基数。如下图:
前缀索引15.jpg
第一条sql是计算不同前缀索引的基数(就是选择进行索引的值的长度)情况下其索引的选择性。
第二条sql是计算完整列的基数。于是这里我们选择8的长度就行了。
执行如下sql加索引就OK:
ALTER TABLE t_offer_record ADD INDEX idx_record_bill_hashcode (record_bill_hashcode(8));
本地执行了数据量1000条左右不加索引大概执行4ms,加了之后执行2ms.
网友评论