Mysql联合索引的列命中

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

我们给某表A,B,C三个字段新建联合索引,顺序为ABC

# 创建测试表
create table a_test
(
  a varchar(20) default '' null,
  b varchar(20) default '' null,
  c varchar(30) default '' null,
  d varchar(40) default '' null
);
# 创建联合索引
create index table_name_a_b_c_index
  on a_test (a, b, c);

Mysql的联合索引,根据最左原则, 有a,ab,abc三个最左索引前缀可供命中

即:只要查询条件中带有a字段条件,或者同时带有ab两个字段的条件,或者同时带有abc三个字段的条件,都会使用到联合索引abc

例1:
explain select * from a_test where  a='ss' and b = 'c'  and d='c' and c='c'

该sql语句的查询条件可以组成abc索引前缀,完整的使用了abc联合索引


例2:
explain select * from a_test where  a='ss' and b = 'c'  and d='c'

该sql语句的查询条件可以组成ab索引前缀,使用了abc联合索引的ab部分


例3:
explain select * from a_test where a='ss' and d='c'

该sql语句的查询条件可以组成A索引前缀,使用了abc联合索引的 a部分


例4:
explain select * from a_test where  b = 'c'  and d='c' and c='cc'

该sql语句并未使用到abc联合索引,因为 无法组成 最左索引前缀

ubuntu无法截图,demo sql 已给出,explain分析结果可以自行执行之后进行查看,同时也可以熟悉explain的key_lenref的字段含义

转载于:https://my.oschina.net/querying/blog/1930448

你可能感兴趣的:(Mysql联合索引的列命中)