組合索引的使用效果的總結

2022-09-16 07:54:08 字數 3185 閱讀 9759

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也沒有發揮索引效果

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也沒有發揮索引效果

mongo explain 查組合索引的使用情況

mongo 3.2版本之前,用 db.olamitvplayoplog.find explain mongo 3.2版本之後,用 db.olamitvplayoplog.explain executionstats find 老版本 大部分資料 db.collection.method explai...

mysql的組合索引 mysql 組合索引

mysql單列索引是我們使用mysql資料庫中經常會見到的,mysql單列索引和組合索引的區別可能有很多人還不是十分的了解,下面就為您分析兩者的主要區別,供您參考學習。為了形象地對比兩者,再建乙個表 create table myindex i testid int not null auto in...

組合索引的索引結構

在網路上有很多mysql的索引的結構的介紹,相信你對索引的結構已經非常了解了,關於組合索引呢?組合索引是在b 樹中的結構是怎麼樣的?怎麼排序的?索引中相同的值,儲存的id是什麼結構?在本篇文章中就跟你一一說明 一 組合索引的圖示 話不多說,直接上圖 上面是根據身高年齡建立的組合索引 height,a...