Mysql索引失效几种情况

文章目录

    • 1、不满足最左前缀匹配原则
    • 2、like查询
    • 3、IS NOT NULL 和 IS NULL
    • 4、对索引列进行操作
    • 5、OR

1、不满足最左前缀匹配原则

最左前缀匹配原则: 以最左边的索引为起点,连续的索引都能使用,除非碰到范围查询(>、<、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);

2、like查询

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%';

在这里插入图片描述

3、IS NOT NULL 和 IS NULL

IS NOT NULL不走索引,IS NULL走索引;(此处存疑)

4、对索引列进行操作

对索引列进行计算、函数、(手动或自动)类型转换,索引会失效;
字符串不加’’,索引失效,因为mysql会自动进行类型转换;

EXPLAIN select * from staffs where name = 2000;

在这里插入图片描述

5、OR

索引列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';

在这里插入图片描述

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