有粉丝留言说,最近碰到一道关于联合索引的面试题,备受打击。
题目如下:
数据库中4个字段id,a,b,c;
其中id主键;
有两个联合索引:ab,ac;
下面几个查询都会用到哪些索引?
select * from t where a=xx and b=xx and c=xx;
select * from t where a=xx and c=xx and b=xx;
select * from t where a=xx and (b=xx or b=xx);
问题看上去貌似挺简单的,但细想又觉得好像很难回答的很全面。
本期就好好研究研究
核心要点

1. 结论
2. 实验验证
索引建立顺序对选取的影响
字段唯一性对选取的影响
索引何种情况下失效
结论
第1和第2个sql,字段顺序是否对索引选取产生影响
第3个sql,or对索引的影响
先把结论写出来,后面用实验来证明!
01
查询条件b和c的先后顺序,
不影响最终的索引选择;
02
ab,ac两个索引均可用的情况下,
优化器优先选择更早创建的索引;
03
唯一性强的字段,会优先被选择;
04
OR会导致部分索引失效;
实验验证

先建两张表t1和t2,
两张表的唯一区别就是建立联合索引的顺序不同。
t1 先建ab联合索引,再建ac联合索引;
t2 先建ac联合索引,再建ab联合索引;
按a,b,c,三个字段不同的唯一性组合来实验
01
a,b,c都唯一
表t1(选择了ab)


表t2(选择了ac)


实验结果:
当两个索引的匹配条件和开销估算相近时,优化器会默认使用先创建的索引
变换字段b和c的位置,对索引的选取没有影响
02
a,b,c都不唯一
表t1(选择了ab)


表t2(选择了ac)


实验结果:
当两个索引的匹配条件和开销估算相近时,优化器会默认使用先创建的索引
变换字段b和c的位置,对索引的选取没有影响
03
a或b唯一,c不唯一
表t1(选择了ab)



表t2(选择了ac)


实验结果:
当两个索引的匹配条件和开销估算相近时,优化器会默认使用先创建的索引
变换字段b和c的位置,对索引的选取没有影响
04
a,b不唯一,c唯一
表t1(选择了ac)


表t2(选择了ac)

实验结果:
唯一性强的字段,会优先被选择
变换字段b和c的位置,对索引的选取没有影响
05
or对索引的影响

explain显示用到的索引键为idx_ac;
key_len 只有5个字节(之前都是10个字节);
a字段类型为int,占4个字节;
字段允许为空,需要用1个字节来记录;
因此这里or会导致部分索引失效,只有a字段用到了索引。
实验结果:
or会导致部分索引失效
总结
实验证明了最初的结论:
where条件顺序不影响索引选取
当两个索引的匹配条件和开销估算相近时,优化器更倾向于选择先创建的索引
唯一性强的字段,会优先被选择
or会导致部分索引失效
【以上仅为个人观点,如有不同意见,欢迎留言讨论!】


点击蓝字 关注我们





