MySQL组合索引不被命中使用的情况

创建组合索引:一个表中可以有多个,用多个列组合构建的索引,这多个列中的值不允许有空值。

ALTER TABLE table_name ADD INDEX index_name(col1,col2,col3);

查询条件中包含索引的前缀部分, 也就是 col1, 可以触发索引的使用

 select * from table_name where col1=1;

使用联合索引的全部索引键, 可触发索引的使用

 select * from table_name where col1=1 and col2=2;

根据最左前缀原则查询条件中包含索引的前缀部分, 也就是 col1, 可以触发索引的使用

select * from table_name where col1=1;

使用部分索引键, 但不包含索引的前缀部分,不可触发索引的使用

 select * from table_name where col2=2;

使用联合索引的全部索引键, 但不是AND操作, 不可触发索引的使用

select * from table_name where col2=2 or col1=1;

使用联合索引的,但是在索引列使用比较、计算的(包含不等于和not)不可触发索引的使用;
但是请注意在对主键和int类型的索引使用比较类型的则可以出发索引;

select * from table_name where col1>0;

使用联合索引的,但是在索引列使用比较、计算的不可触发索引的使用

select * from table_name where col1>0;

使用联合索引的,但是在索引列使用前导模糊查询、正则匹配的不可触发索引的使用

select * from table_name where col1 like  "%1"; //不可命中索引
select * from table_name where col1 regex" “^%1"; //不可命中索引
select * from table_name where col1 like  "1%"; //可以命中索引

使用联合索引的,但是在索引列使用In查询的不可触发索引的使用

select * from table_name where col1 in  1,2;

使用联合索引的,但是使用连接查询的不可触发索引的使用,因为连接查询是生成了临时表,因为临时表没有索引

select table_name.* from table_name,table_name2 where table_name.col1=1;

使用联合索引的,但是索引列类型与查询条件的类型不同的也不会触发索引(如索引类型是int,而查询条件是string)

select * from table_name where col1='0';

你可能感兴趣的:(MySQL组合索引不被命中使用的情况)