问题
需要对(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
的元素添加到结果中即可。
提示
这篇文章是我看了其他人的博客所得出的结论,还需要参考官方的文献资料进行佐证,如果有什么错误,欢迎在评论区提出。