最左匹配原則


寫在前面:我在上大學的時候就聽說過數據庫的最左匹配原則,當時是通過各大博客論壇了解的,但是這些博客的局限性在於它們對最左匹配原則的描述就像一些數學定義一樣,往往都是列出123點,滿足這123點就能匹配上索引,否則就不能。但是我覺得編程不是死記硬背,這個所謂最左匹配原則肯定是有他背后的原理的。所以我嘗試說明一下這個原理,這樣以后用上優化索引的時候就不需要去記這些像數學定理一樣的東西。了解原理比記住某些表面特點,我覺得是更聰明的方式。

1.簡單說下什么是最左匹配原則
顧名思義:最左優先,以最左邊的為起點任何連續的索引都能匹配上。同時遇到范圍查詢(>、<、between、like)就會停止匹配。
例如: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是無序的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM