寫在前面:我在上大學的時候就聽說過資料庫的最左匹配原則,當時是通過各大部落格論壇了解的,但是這些部落格的侷限性在於它們對最左匹配原則的描述就像一些數學定義一樣,往往都是列出123點,滿足這123點就能匹配上索引,否則就不能。但是我覺得程式設計不是死記硬背,這個所謂最左匹配原則肯定是有他背後的原理的。所以我嘗試說明一下這個原理,這樣以後用上優化索引的時候就不需要去記這些像數學定理一樣的東西。了解原理比記住某些表面特點,我覺得是更聰明的方式。
1.簡單說下什麼是最左匹配原則
顧名思義:最左優先,以最左邊的為起點任何連續的索引都能匹配上。同時遇到範圍查詢(>、
例如:b = 2 如果建立(a,b)順序的索引,是匹配不到(a,b)索引的;但是如果查詢條件是a = 1 and b = 2或者a=1(又或者是b = 2 and b = 1)就可以,因為優化器會自動調整a,b的順序。再比如a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)順序的索引,d是用不到索引的,因為c欄位是乙個範圍查詢,它之後的字段會停止匹配。
2.最左匹配原則的原理
最左匹配原則都是針對聯合索引來說的,所以我們有必要了解一下聯合索引的原理。了解了聯合索引,那麼為什麼會有最左匹配原則這種說法也就理解了。
我們都知道索引的底層是一顆b+樹,那麼聯合索引當然還是一顆b+樹,只不過聯合索引的健值數量不是乙個,而是多個。構建一顆b+樹只能根據乙個值來構建,因此資料庫依據聯合索引最左的字段來構建b+樹。
例子:假如建立乙個(a,b)的聯合索引,那麼它的索引樹是這樣的
可以看到a的值是有順序的,1,1,2,2,3,3,而b的值是沒有順序的1,2,1,4,1,2。所以b = 2這種查詢條件沒有辦法利用索引,因為聯合索引首先是按a排序的,b是無序的。
同時我們還可以發現在a值相等的情況下,b值又是按順序排列的,但是這種順序是相對的。所以最左匹配原則遇上範圍查詢就會停止,剩下的字段都無法使用索引。例如a = 1 and b = 2 a,b欄位都可以使用索引,因為在a值確定的情況下b是相對有序的,而a>1and b=2,a欄位可以匹配上索引,但b值不可以,因為a的值是乙個範圍,在這個範圍中b是無序的。
mysql取締最左匹配原則 最左匹配原則
一 這條sql語句select from dept where age 12 and name like a 雖然age條件在前,name在後,看似不滿足最左側原則,但這條語句在執行的過程中mysql優化器會將該條語句優化為select from dept where name like a and...
Mysql最左匹配原則
看了好多部落格,講講自己的理解 索引的底層是一顆b 樹,那麼聯合索引當然還是一顆b 樹,只不過聯合索引的健值數量不是乙個,而是多個。構建一顆b 樹只能根據乙個值來構建,因此資料庫依據聯合索引最左的字段來構建b 樹。例子 假如建立乙個 a,b 的聯合索引,那麼它的索引樹是這樣的 可以看到a的值是有順序...
MySQL索引 最左匹配原則
表結構,有三個字段,分別是id,name,cid create table student id int 11 not null auto increment,name varchar 255 default null,cid int 11 default null,primary key id k...