索引優化策略
- 最左前綴匹配原則
- 主鍵外檢一定要建索引
- 對 where,on,group by,order by 中出現的列使用索引
- 盡量選擇區分度高的列作為索引,區分度的公式是count(distinct col)/count(*),表示字段不重復的比例,比例越大我們掃描的記錄數越少,唯一鍵的區分度是1,而一些狀態、性別字段可能在大數據面前區分度就是0
- 對較小的數據列使用索引,這樣會使索引文件更小,同時內存中也可以裝載更多的索引鍵
- 索引列不能參與計算,保持列“干凈”,比如from_unixtime(create_time) = ’2014-05-29’就不能使用到索引,原因很簡單,b+樹中存的都是數據表中的字段值,但進行檢索時,需要把所有元素都應用函數才能比較,顯然成本太大。所以語句應該寫成create_time = unix_timestamp(’2014-05-29’);
- 為較長的字符串使用前綴索引
- 盡量的擴展索引,不要新建索引。比如表中已經有a的索引,現在要加(a,b)的索引,那么只需要修改原來的索引即可
- 不要過多創建索引, 權衡索引個數與DML之間關系,DML也就是插入、刪除數據操作。這里需要權衡一個問題,建立索引的目的是為了提高查詢效率的,但建立的索引過多,會影響插入、刪除數據的速度,因為我們修改的表數據,索引也需要進行調整重建
- 對于like查詢,”%”不要放在前面。
SELECT * FROMhoudunwangWHEREunameLIKE'后盾%' -- 走索引SELECT * FROMhoudunwangWHEREunameLIKE "%后盾%" -- 不走索引 - 查詢where條件數據類型不匹配也無法使用索引
字符串與數字比較不使用索引;CREATE TABLEa(achar(10));EXPLAIN SELECT * FROMaWHEREa="1"– 走索引
EXPLAIN SELECT * FROMaWHEREa=1 – 不走索引
正則表達式不使用索引,這應該很好理解,所以為什么在SQL中很難看到regexp關鍵字的原因
參考文章:
http://blog.csdn.net/suifeng3051/article/details/49530299?locationNum=1
http://tech.meituan.com/mysql-index.html
https://yq.aliyun.com/articles/39841
http://blog.csdn.net/lovelion/article/details/8462814
浙公網安備 33010602011771號