背景:最近負責的招聘系統出現了一些慢查詢,已經解決了不少,但是還有,今天報了一個慢查詢,諮詢了下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,我的數據是這樣的,如下圖:
按照上面博客中的步驟和思路,我們執行一下sql看一下索引的選擇性和基數。如下圖:
第一條sql是計算不同前綴索引的基數(就是選擇進行索引的值的長度)情況下其索引的選擇性。
第二條sql是計算完整列的基數。於是這裏我們選擇8的長度就行了。
執行如下sql加索引就OK:
ALTER TABLE t_offer_record ADD INDEX idx_record_bill_hashcode (record_bill_hashcode(8));
本地執行了數據量1000條左右不加索引大概執行4ms,加了之後執行2ms.