暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

面试被打击,看似简单却暗藏陷阱的联合索引

运维路书 2024-11-05
65



有粉丝留言说,最近碰到一道关于联合索引的面试题,备受打击。

题目如下:

数据库中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会导致部分索引失效


【以上仅为个人观点,如有不同意见,欢迎留言讨论!】


点击蓝字 关注我们

文章转载自运维路书,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论