為什麼有最左原則?
例如你這個聯合索引是
state/city/zipcode
那麼state就是第一關 city是第二關, zipcode就是第三關
你必須匹配了第一關,才能匹配第二關,匹配了第一關和第二關,才能匹配第三關
你不能直接到第二關的
索引的格式就是第一層是state,第二層才是city
多列索引是先按照第一列進行排序,然後在第一列排好序的基礎上再對第二列排序,如果沒有第一列的話,直接訪問第二列,那第二列肯定是無序的,直接訪問後面的列就用不到索引了。
假設資料
表t (a,b,c) rowid
為物理位置
rowid a b c
(1) 1 1 1
(2) 2 1 13
(3) 2 2 14
(4) 1 3 3
(5) 2 3 12
(6) 1 2 5
(7) 2 3 9
(8) 1 2 2
(9) 1 3 6
(10) 2 2 11
(11) 2 2 8
(12) 1 1 7
(13) 2 3 15
(14) 1 1 4
(15) 2 1 10
當你建立乙個索引 create index *** on t(a,b), 則索引檔案邏輯上等同於如下
a b rowid
1 1 1
1 1 12
1 1 14
1 2 6
1 2 8
1 3 4
1 3 9
2 1 2
2 1 15
2 2 3
2 2 10
2 2 11
2 3 5
2 3 7
2 3 13
當select * from t where a=1 and b=3 的時候, 資料庫系統可以直接從索引檔案中直接二分法找到a=1的記錄,然後再b=3的記錄。
但如果你 where b=3 則需要遍歷這個索引表的全部!
總結:通常說的索引是
b+tree索引,
樹狀的,搜尋需要從根節點出發,上層節點對應靠左的值,搜尋需要從根節點出發,否則不從根節點出發,後面的節點對應下層的值,依舊是亂序的,需要遍歷,所以索引就失效了,所以有最左原則。
組合索引的使用:
例如組合索引(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也沒有發揮索引效果
mysql一組合索引
命名規則 表名 欄位名 1 需要加索引的字段,要在where條件中 2 資料量少的字段不需要加索引 3 如果where條件中是or關係,加索引不起作用 4 符合最左原則 聯合索引又叫復合索引。對於復合索引 mysql從左到右的使用索引中的字段,乙個查詢可以只使用索引中的一部份,但只能是最左側部分。例...
GoLang設計模式20 組合模式
組合模式是一種結構型設計模式。當我們想把一組物件當做乙個整體來處理時就可以考慮使用組合模式。組合模式被視為是介面型設計模式是因為它將一組物件組裝為乙個樹狀結構。這個樹狀結構中的每個獨立元件都可以用同樣的方式來處理 無論它們是複雜的還是原始的。以計算機作業系統中的檔案系統為例。在檔案系統中有檔案 fi...
設計模式之美20 組合模式
組合模式用的很少 組合模式跟我們之前講的物件導向設計中的 組合關係 通過組合來組裝兩個類 完全是兩碼事。這裡講的 組合模式 主要是用來處理樹形結構資料。這裡的 資料 將一組物件組織 compose 成樹形結構,以表示一種 部分 整體 的層次結構。組合讓客戶端 在很多設計模式書籍 中,客戶端 代指 的...