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.

發佈了174 篇原創文章 · 獲贊 75 · 訪問量 36萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章