联合索引的最左匹配原则(范围查询会导致索引失效)

    联合索引

    联合索引是指对表上的多个列进行索引,联合索引也是一棵B+树,联合索引与其他索引不同的是联合索引的键值数量大于等于2。
 
 

    最左匹配原则

   假设我们创建了一个如下的联合索引:

create index lhsy on test(a,b,c,d)

   那么根据联合索引的最左匹配原则我们进行如下查询是会走索引的:

select * from table_name where a = '1';
select * from table_name where a = '1' and b = '2';
select * from table_name where a = '1' and b = '2' and c = '3';
select * from table_name where a = '1' and b = '2' and c = '3' and d = '4';

   
    顺序可以随意,比如:

select * from table_name where b = '1' and c = '2' and a = '3' and d = '4';

    这种也是可以走联合索引的,没有a,剩下的几个字段是都不会走索引的!!!
   
   但是,如果你在中间加入了模糊查询例如:

select * from table_name where a = '1' and b = '2' and c > '3' and d = '4';

   那么就只有a,b,c会走索引,因为c用了模糊查询d是不会走联合索引的
   
    来验证一下:
   
    先建立一个表t,字段为c1,c2,c3,c4,c5
联合索引的最左匹配原则(范围查询会导致索引失效)_第1张图片
   
   然后设置联合索引
联合索引的最左匹配原则(范围查询会导致索引失效)_第2张图片
   

在mysql中字符集为utf-8时一个varchar占三个字节,我设置每个字段最多一位,我猜测索引的长度也为三,这里看到如果四个字段查询都走了索引,看到key_len为12。
联合索引的最左匹配原则(范围查询会导致索引失效)_第3张图片
   
   然后c3改为模糊查询,在次执行查询
联合索引的最左匹配原则(范围查询会导致索引失效)_第4张图片
   
   可以看到key_len变成了9,少了3个字节,如果我前面猜测是正确的话,可推测出c4这个字段是没走索引的。
   
   至此,我的结论就是,在符合最左匹配原则的情况下进行查询,如果中间有字段模糊查询(范围查询),那么这个字段后面的字段都不会走索引。
   
   Tip:例如下面这几查询结果都是一样的,按照索引创建时的顺序,c1、c2、c3、c4,c3进行了模糊查询那么c4就不会走索引。

EXPLAIN select c5 from t where c1="1"  and c2='1'and c3>'0'and c4="1" ;
EXPLAIN select c5 from t where c1="1"  and c4='1'and c3>'0'and c2="1" ;
EXPLAIN select c5 from t where c4="1"  and c1='1'and c3>'0'and c2="1" ;
EXPLAIN select c5 from t where c2="1"  and c4='1'and c3>'0'and c1="1" ;

   这只是我的推测结果,我的知识储备不多(本来人也菜),希望看到这篇博客的大佬们能说明这个问题,能说明其中缘由就更好了,十分感谢!

你可能感兴趣的:(sql,mysql)