mysql慢sql优化前缀索引实战

作者: spring_coderman | 来源:发表于2020-01-10 14:46 被阅读0次

    背景:最近负责的招聘系统出现了一些慢查询,已经解决了不少,但是还有,今天报了一个慢查询,咨询了下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.

    相关文章

      网友评论

        本文标题:mysql慢sql优化前缀索引实战

        本文链接:https://www.haomeiwen.com/subject/zrnpactx.html