请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

联合索引最左匹配原则

按照课程中关于最左匹配原则的说明建立了一张表,DDL如下:
CREATE TABLE user_info_large (
id int(11) NOT NULL AUTO_INCREMENT,
a varchar(32) NOT NULL,
b varchar(32) NOT NULL,
c varchar(32) NOT NULL,
d varchar(32) NOT NULL,
PRIMARY KEY (id),
KEY indx_keys (a,b,c)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
执行 explain select * from user_info_large where a=‘aa1’ and b like ‘%bb%’ and c=‘cc1’ 结果如下:
图片描述貌似和教程中对于最左匹配原则遇到范围查询就停止匹配的原则不一致啊,是我哪儿理解的有问题?

正在回答 回答被采纳积分+3

1回答

翔仔 2019-01-28 11:49:47

同学好,最左匹配原则,视频里指的是比如说设置(a,b,c,d)联合索引  如果 where a=1 and b=2 and c >3 and d=4 则不会走,即便where a=1 and b=2 and  d=4  and  c >3也不会走,跟字段顺序无关,如果你是where a=1 and b=2 and c =3 and d>4 或者 where a=1 and b=2 and d=4   and  c >3 也还是会走

0 回复 有任何疑惑可以回复我~
  • 提问者 qq_Loveyoulovef_0 #1
    老师说的这个我理解了,我的问题其实是这样的,我设置了联合索引(a,b,c)我的where条件是where a ='aa' and b like '%bb%' and c='cc',b这个字段进行了范围查询,那么这个时候其实是不会走索引的,而应该是走全表扫描的,但是我执行explain的结果却是走了我自己的索引的,也就是上面的截图
    回复 有任何疑惑可以回复我~ 2019-01-28 19:48:20
  • 翔仔 回复 提问者 qq_Loveyoulovef_0 #2
    同学好,我的回答的后半段就是要表达这个意思呢,比如说设置(a,b,c,d)联合索引,如果你是where a=1 and b=2 and c =3 and d>4 或者 where a=1 and b=2 and d=4   and  c >3 也还是会走。就是说最左匹配只是到范围查询后会停下来,包括范围查询的字段,而与and的顺序无关,sql编译器会做适时调整的,如果你的索引是a,b,c,d就不会走了
    回复 有任何疑惑可以回复我~ 2019-01-29 01:30:40
  • YoungFFan 回复 提问者 qq_Loveyoulovef_0 #3
    你这种情形不会使用(a,b,c)索引。但是建立(a,b,c)联合索引就相当于建立了(a),(a,b),(a,b,c)这三个索引,你这种情形从b列开始索引失效,但a列索引依然发挥作用,相当于使用了(a)索引。
    回复 有任何疑惑可以回复我~ 2019-06-12 17:48:40
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信