【MySQL】面试题之:如果一个表a字段是从1~100,b字段是从1~1000,c是从1~10000,选取哪个列作为索引?

具体问题:58、如果一个表a字段是从1~100b字段是从1~1000c是从1~10000,选取哪个列作为索引,为什么?如果需要查找a>一个数,b=一个数,c小于一个数,如何创建联合索引?


以下是我个人的思考,这个问题是在字节面试的时候问的,当时答得不好,现在回过头来再思考一下,当然还是比较浅显,也不一定对,希望了解的人可以在回复里面补充一下。

前面一个问题,首先重复率高的字段不适合用于作为索引,因此应该选c字段作为索引,因为c字段的重复率最低。那为什么选择重复率低的字段呢,主要两个理由:

1、因为如果对重复率很高的字段设置了索引,首先因为这个一定是是辅助索引,查询的时候还要回表,也就是得到了行号,还要到主键的聚簇索引里面再查,重复率高就意味着会进行大量的回表操作,效率很低。重复率低意味着更少的回表操作。

2、另外,c字段里面每一个要查找的值的数量,差不多都是b的十分之一,比如c=1的数量可能是b=1的数量的十分之一,也就是说它最后返回的结果的数量更少,范围更小,可以更快查到,所以用c作为索引。


对于第二个问题,这是关于联合索引的问题,在创建联合索引的时候,一般选择将选择性高的字段放在前面,所谓的选择性高,就是使用这个字段来进行查询的话,他可以过滤的数据更多,得到的结果更少,这里如果单纯讨论选择性的话,肯定是c字段的选择性更高,但是我们使用联合索引的时候还要考虑最左原则

最左原则里MySQL会一直向右匹配直到遇到范围查询。如有索引 (a,b,c,d),查询条件 a=1 and b=2 and c>3 and d=4,则会在每个节点依次命中a、b、c,无法命中d。如题意,里面两个都是范围查询,因此b索引是值查询,索引索引首先建在b上。

然后是c,因为c即使是范围搜索,他还是可以集中索引,只有范围索引后面的一个才不能击中索引,因此最后的创建联合索引的顺序是:b,c,a。

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值