MySQL數據庫索引的最左匹配原則

一. 聯合索引說明

建立三個字段的聯合索引

聯合索引(a,b,c)相當於建立瞭索引:(a),(a,b),(a,b,c)

二. 那ac是否能用到索引呢?

先給出結論:a可以命中聯合索引(a,b,c),c無法命中,所以ac組合無法命中聯合索引。

1.建立abc聯合索引(province,city,district)

在這裡插入圖片描述

ac索引查詢

SELECT * FROM user_address WHERE province = '廣東' 
AND district = '南雄市'

在這裡插入圖片描述

顯示查詢范圍是ALL

2.直接建立ac兩個字段得聯合索引

在這裡插入圖片描述

SELECT * FROM user_address WHERE province = '廣東' 
AND district = '南雄市'

在這裡插入圖片描述

查詢結果是ref走瞭索引,掃描的行數也從21行變成瞭13行

3.ab索引查詢
在這裡插入圖片描述

查詢范圍為ref

結論

abc聯合索引,ac中的c不能命中這三個字段的聯合索引,a可以命中,所以possible_keys列會顯示使用瞭聯合索引

三. 思考

abc索引,acb會走索引嗎?

  • 最左前綴匹配原則,mysql會一直向右匹配直到遇到范圍查詢(>、<、between、like)就停止匹配,
  • 比如a=3 and b=4 and c>5 and d=6如果建立(a,b,c,d)順序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引則都可以用到,a,b,d的順序可以任意調整。
  • =和in可以亂序,比如a=1 and b=2 and c=3建立(a,b,c)索引可以任意順序,mysql的查詢優化器會幫你優化成索引可以識別的形式

四. 最左匹配原則的成因

  • 因為聯合索引,如:abc,聯合索引可以理解為有序的且形成的基礎是建立在a上的,從a上建立b,b上建立c,所以必須要按照順序來
  • 可以簡單理解為:先對a排序建立索引,再在a的基礎上對b進行排序,再是c
  • 所以聯合索引在遇到范圍查詢,後面的索引會失效。

到此這篇關於MySQL數據庫索引的最左匹配原則的文章就介紹到這瞭,更多相關MySQL 索引最左匹配 內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: