問題
需要對(a,b,c)三列建立聯合索引,查詢語句爲select * from table where a < 100 and b = 100 and c > 100;
,由於mysql會對where部分優化,所以a,b,c的順序不一定。
在建立索引的時候,要按什麼順序呢?
我對聯合索引的理解
聯合索引的所有索引列都出現在索引的非子節點上,搜索時會依次比較三列的大小。對同一語句,建立索引的順序決定了索引的利用率。
我認爲的答案
建立索引的順序爲b,a,c。
b作爲第一個比較的對象,通過一次搜索,定位到子結點上b = 100
的位置,根據b+樹搜索的規則,該位置在葉子節點中,他右邊(後面)的元素都滿足b >= 100
,而左邊(前面)的元素都滿足b < 100
。
利用b+樹的葉子節點可以遍歷的特性,從該元素向後遍歷,遍歷到前n個元素滿足b = 100
。記這n
個元素的範圍爲range
。
a作爲第二個比較的對象,根據規則,在不指定升序/降序的情況下,MySQL建立的索引默認是升序的。我們需要查找的對象需要滿足a < 100
,在滿足b = 100
的範圍range
中,a < 100
在range
中處在靠前的位置,我們只需要遍歷靠前的m
元素。而m <= n
。這樣就減小了遍歷的範圍。
c作爲最後一個比較的對象,我們在遍歷滿足a < 100 and b = 100
的m
個元素中,只需要選擇符合c > 100
的元素添加到結果中即可。
提示
這篇文章是我看了其他人的博客所得出的結論,還需要參考官方的文獻資料進行佐證,如果有什麼錯誤,歡迎在評論區提出。