有一题面试题 求解

bravo
  • 99

上题:

图片描述
求解: 以及为什么……? 谢谢!

回复
阅读 1.8k
5 个回答
hxd_
  • 1.7k

最基础的就是联合索引的规则和最左优先原则了,
1.用到a,b字段;
2.用不上索引
3.用到a字段;
4.用到a字段,in条件走不走索引需要考虑mysql版本
5.用到a,b字段,优化器会处理并能够使用到最左前缀原则,同时索引支持范围查询

详细的建议看文档 - 优化与索引,或者 我推荐的Mysql的小册,索引一章超极详细

这个联合索引拆开来是三个索引
(a) (a,b) (a,b,c)
(1)走(a,b)
(2)不走索引,这个就好比一个楼梯,第一楼没了,你怎么上二楼呢?
(3)走(a)
(4)走(a),题目中说了a的区分度很高,根据成本代价计算,按道理in里面两个值优化器是会选择走到(a)索引
(5)走(a,b)先根据a定位好然后再根据b去走range

1,3,分别用2和1个字段,联合索引有个左前缀匹配规则
index(a,b,c)能够匹配的就是:
a
a b
a b c

能用到索引的选项:
(1),用到a,b字段;
(3),用到a字段;
(4),用到a字段;
(5),用到a,b字段。

这个是设计到mysql索引的最左原则。
mysql的索引为什么是执行的最左原则的,是由于索引就是B+树,而联合索引实际上也是一棵B+树,是按左到右的顺序排序的,所以搜索的时候会从左到右。

针对题目的答案:

1、where a=? and b=?

会使用到 a 和 b 的索引

2、where b=? and c=?

不会用到任何索引

3、where a=? and c=?

会使用到索引 a,不会用到索引 c

4、where b=? and a in (?,?)

不会用到索引

5、where b > ? and c=? and a=?

不会用到索引

PS:

针对这个题目,还会有一种情况,给你思考一下?
where a=? and b>? and c=?
这个会用到哪些索引呢?
宣传栏