最左前缀匹配原则: 以最左边的索引为起点,连续的索引都能使用,除非碰到范围查询(>、<、between、like),= 和 in 的查询语句可以调换顺序;
-- 建表
create table staffs(
id INT PRIMARY KEY,
name VARCHAR(200),
age INT,
pos VARCHAR(200),
add_time TIMESTAMP
);
create index idx_name_age_pos on staffs(name,age,pos);
1、查询的列刚好是索引列,则 like %key%、like %key、like key%时,索引均生效;
EXPLAIN select name,age,pos from staffs where name like '%3%';
EXPLAIN select name,age,pos from staffs where name like '%3';
EXPLAIN select name,age,pos from staffs where name like '3%';
2、查询的列中有的不是索引列,则 like %key%、like %key、时,索引均失效,**like key%**时索引生效;
EXPLAIN select name,age,pos,add_time from staffs where name like '%3%';
EXPLAIN select name,age,pos,add_time from staffs where name like '%3';
EXPLAIN select name,age,pos,add_time from staffs where name like '3%';
IS NOT NULL不走索引,IS NULL走索引;(此处存疑)
对索引列进行计算、函数、(手动或自动)类型转换,索引会失效;
字符串不加’’,索引失效,因为mysql会自动进行类型转换;
EXPLAIN select * from staffs where name = 2000;
索引列A or 索引列B
索引列A or 非索引列B
以上三种情况,均可能会出现索引失效
drop index idx_name_age_pos on staffs;
create index idx_name on staffs(name);
create index idx_pos on staffs(pos);
EXPLAIN select name,pos from staffs where name = '2000' OR pos = 'dev';
EXPLAIN select name,age from staffs where name = '2000' OR age = '23';