對線面試官:Mysql組合索引的生效規則

PHPer技術棧發表於2022-05-16

Mysql中索引分為Hash和Btree,myisam,innodb引擎預設使用Btree索引
組合索引可以這樣理解,比如(a,b,c),abc都是排好序的,在任意一段a的下面b都是排好序的,任何一段b下面c都是排好序的;
組合索引的生效規則
1.組合索引多欄位是有序的,並且是個完整的BTree 索引,有最左原則

多列索引是先按照第一列進行排序,然後在第一列排好序的基礎上再對第二列排序,如果沒有第一列的話,直接訪問第二列,那第二列肯定是無序的,直接訪問後面的列就用不到索引了。

搜尋需要從根節點出發,上層節點對應靠左的值,搜尋需要從根節點出發,否則不從根節點出發,後面的節點對應下層的值,依舊是亂序的,需要遍歷,所以索引就失效了,所以有最左原則。

2.組合索引的使用:

例如組合索引(a,b,c),組合索引的生效原則是,從前往後依次使用生效,如果中間某個索引沒有使用,那麼斷點前面的索引部分起作用,斷點後面的索引沒有起作用;

比如

where a=3 and b=45 and c=5 .... 這種三個索引順序使用中間沒有斷點,全部發揮作用;

where a=3 and c=5... 這種情況下b就是斷點,a發揮了效果,c沒有效果

where b=3 and c=4... 這種情況下a就是斷點,在a後面的索引都沒有發揮作用,這種寫法聯合索引沒有發揮任何效果;

where b=45 and a=3 and c=5 .... 這個跟第一個一樣,全部發揮作用,abc只要用上了就行,跟寫的順序無關
組合索引使用判斷:

(0) select * from mytable where a=3 and b=5 and c=4;

abc三個索引都在where條件裡面用到了,而且都發揮了作用

(1) select * from mytable where c=4 and b=6 and a=3;

這條語句列出來只想說明 mysql沒有那麼笨,where裡面的條件順序在查詢之前會被mysql自動最佳化,效果跟上一句一樣

(2) select * from mytable where a=3 and c=7;

a用到索引,b沒有用,所以c是沒有用到索引效果的

(3) select * from mytable where a=3 and b>7 and c=3;(範圍值就算是斷點)

a用到了,b也用到了,c沒有用到,這個地方b是範圍值,也算斷點,只不過自身用到了索引

(4) select * from mytable where b=3 and c=4;

因為a索引沒有使用,所以這裡 bc都沒有用上索引效果

(5) select * from mytable where a>4 and b=7 and c=9;

a用到了 b沒有使用,c沒有使用

(6) select * from mytable where a=3 order by b;

a用到了索引,b在結果排序中也用到了索引的效果,前面說了,a下面任意一段的b是排好序的

(7) select * from mytable where a=3 order by c;

a用到了索引,但是這個地方c沒有發揮排序效果,因為中間斷點了,使用 explain 可以看到 filesort

(8) select * from mytable where b=3 order by a;

b沒有用到索引,排序中a也沒有發揮索引效果
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章