我們都知道Mysql數據庫的最左前綴原則。
比如有如下表,表有三個字段a,b,c
table
a | b | c |
現在我建立了一個聯合唯一索引:`uk_a_b_c` (a,b,c)
那么按照最左前綴匹配原則:我在查詢條件中,如下情況都能用到索引:
(1)select * from table where a = 1 (2)select * from table where a = 1 and b =1 (3)select * from table where a = 1 and b =1 and c= 1 (4)select * from table where a = 1 and c= 1
前三個都很好理解,第四個就有點繞了
其原理是:
b+樹的數據項是復合的數據結構,比如(name,age,sex)的時候,b+數是按照從左到右的順序來建立搜索樹的。
比如當(張三,20,F)這樣的數據來檢索的時候,b+樹會優先比較name來確定下一步的所搜方向,如果name相同再依次比較age和sex,最后得到檢索的數據;
但當(20,F)這樣的沒有name的數據來的時候,b+樹就不知道下一步該查哪個節點,因為建立搜索樹的時候name就是第一個比較因子,必須要先根據name來搜索才能知道下一步去哪里查詢。
比如當(張三,F)這樣的數據來檢索時,b+樹可以用name來指定搜索方向,但下一個字段age的缺失,所以只能把名字等於張三的數據都找到,然后再匹配性別是F的數據了, 這個是非常重要的性質,即索引的最左匹配特性。