记一次面试联合索引题目

问题

需要对(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的元素添加到结果中即可。

提示

这篇文章是我看了其他人的博客所得出的结论,还需要参考官方的文献资料进行佐证,如果有什么错误,欢迎在评论区提出。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值