文章目錄
一、索引是什麼
根據官方文檔所定義:索引(Index)是幫助MySQL高效獲取數據的數據結構,簡單點理解,就是好比去圖書館在成千上萬的書中找一本書,圖書管理員告訴你在哪個樓層哪個房間的哪個櫃子,這就是索引,爲了讓你更方便快捷的找到自己的數據,在計算機中,可以提高數據檢索的效率,減低數據庫的IO成本,降低數據排序的成本,降低CPU的消耗,也就是,排好序的快速查找數據結構。然而當我們在MySQL的日常使用索引中,有很多種情況會使索引失效,下面爲大家詳解,希望大家避免此類的索引。
二、MySQL索引分類
1、單值索引:即一個索引只包含單個列,一個表可以有多個單值索引。
2、唯一索引:索引列的值必須唯一,但允許有空值。
3、複合索引:即一個索引包含多個列
三、MySQL索引結構
1、BTree索引
2、Hash索引
3、full-text全文索引
4、R-Tree索引
四、MySQL中創建索引的方法
1、create index 索引名 on 表名(列名)
2、alter 表名 add index 索引名 on (列名)
五、MySQL中索引的幾種級別(性能由好到壞)
- NULL:不用訪問表或者索引,直接就能得到結果。
- coust、system:單表中最多有一個匹配行,查詢速度很快。
- eq_ref:唯一性索引掃描。
- ref:非唯一性索引。
- range:掃描部分索引,索引範圍掃描。
- index:掃描全部索引樹
- ALL:全表掃描
六、MySQL正確使用索引示例
1、表數據
2、索引列:id,deptName,locAdd
3、由下圖可以看出,explain分析後,我們使用到了我們我們創建的id_dept索引(紅色部分),索引長度爲63(藍色部分),列與索引使用常數類型比較(黃色部分),接下來逐一說明索引失效的情況。
七、MySQL索引失效的幾種情況(應該避免)
1、最佳左前綴法則,如果索引了多列, 就要從索引的最左端開始且不跳過索引列。如不遵守,則索引失效。
如下圖可以看到,在建立了多列索引的前提下(id,deptName,locAdd),在查找時卻跳過了之前的索引列,也就好比這個團隊中沒有大哥了,所以索引失效,使用的全表掃描(ALL)。
2、不要在索引列上做任何操作(如計算,函數,類型轉換),會導致索引失效。
還是剛纔的表,這次我查詢id,但是做了加法運算,由於id爲索引列,所以導致索引失效,使用了全表掃描(ALL),同樣,不能在索引列上使用任何計算,函數,類型轉換。
3、存儲引擎不能使用索引中範圍條件右邊的列,會導致索引失效。
如下圖所示,查詢時在where語句後的locAdd列使用了大於號,也就是查詢索引列中大於11的值,也就是索引中範圍條件右邊的列,導致索引失效,使用了全表掃描(ALL),所以要避免這種情況。
4、在使用(!=或者<或者>)的時候會導致索引失效。
如下圖所示,在查詢時,在索引列上使用了!=(不等於),導致索引失效,使用了全表掃描(ALL),同樣要避免這種情況。
5、is null、is not null也無法使用索引。
由下圖可見,當我們在索引列LocAdd上使用了is not null,同樣索引失效,使用了全表掃描(ALL),切記避免。
6、like以通配符開頭(%xxx)同樣導致索引失效。
如下圖所示,在查詢中,索引列(deptName)使用like,但是使用了通配符%放在了前面,同樣導致索引失效,使用了全表掃描(ALL),同樣避免。
7、當全表掃描或者主鍵掃描優於索引掃描時索引失效。
可見下圖,key字段中使用的primary,也就是我們的主鍵掃描,可見在這種情況下索引也失效。
8、當使用or時前後沒有同時使用索引導致索引失效。
由下圖可知,explain分析可能使用到我們的索引,但是實際並沒有使用,還是使用的全表掃描(ALL),就是因爲我們使用的or前後索引不一致,所以避免在使用索引的時候使用or。
八、MySQL使用索引的建議
1、儘量使用全值匹配。
2、儘量使用覆蓋索引。
3、對於單值索引,儘量選擇針對當前查詢過濾性更好的索引。
4、在選擇組合索引的時候,當前查詢語句中過濾性最好的字段在索引字段順序中,位置越靠前越好。
5、在選擇組合索引的時候,儘量選擇可以能夠包含當前查詢語句中的where字句中更多字段的索引。
6、儘可能通過分析統計信息和調整查詢語句的寫法來達到選擇合適索引的目的。
九、總結
固然使用在MySQL中使用索引會帶給我們更多的方便,但是如果我們的查詢語句出現上述情況,我們的索引反而並沒有起到作用,所以在日常工作和學習中要儘量避免這些種情況,提高我們的工作效率。