記一次面試聯合索引題目

問題

需要對(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 < 100range中處在靠前的位置,我們只需要遍歷靠前的m元素。而m <= n。這樣就減小了遍歷的範圍。

c作爲最後一個比較的對象,我們在遍歷滿足a < 100 and b = 100m個元素中,只需要選擇符合c > 100的元素添加到結果中即可。

提示

這篇文章是我看了其他人的博客所得出的結論,還需要參考官方的文獻資料進行佐證,如果有什麼錯誤,歡迎在評論區提出。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章