mysql慢sql优化前缀索引实战

背景:最近负责的招聘系统出现了一些慢查询,已经解决了不少,但是还有,今天报了一个慢查询,咨询了下dba,可以加前缀索引优化。

出问题的sql:select * from t_offer_record where record_bill_hashcode = ?
执行时间:336ms
我这边按一般排查套路走了一遍,这里简单演示一下

  1. 看sql是否复杂
  2. 看sql查询了多少字段
  3. 看sql关联了几张表
  4. 看sql的查询条件
    前面几步肉眼可以分析得到结论和大概的切入点
  5. 看sql查的表数据量有多少(实操)
    select count(*) from t_offer_record //2.5w条
  6. 看sql查的表上的索引情况(实操)
    show index from t_offer_record //只有主键索引
  7. 看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.

发布了159 篇原创文章 · 获赞 69 · 访问量 35万+

猜你喜欢

转载自blog.csdn.net/u010504064/article/details/103953438