1.最左前缀原则

1.1 模糊查询like使用“name%”索引可用,“%name”索引失效

1.2 组合索引包含从左到右的字段使用索引,不包含左边的字段索引失效

create index idx_id_name_age on user(id,name,age);

使用索引:

select * from user where id=1 and name="test" and age>5;
select * from user where id=1 and age=5 and name="test";
select * from user where id>2;    

不使用索引:

select * from user where name="test" and age>5;  

1.3 组合索引范围搜索,范围搜索后的字段不使用索引

使用索引:

create index idx_id_name_age on user(id,name,age);
   select * from user where id=1 and name="test" and age>5;

不使用索引:

select * from user where id=1 and age>5 and name="test";    

2.字符匹配原则

2.1 数据类型不匹配,导致索引失效

name是varchar类型,age是int类型

select * from user where name=111;
select * from user where age="5";

2.2 联合查询时,字符集不匹配导致索引失效

create table user(
    `userid` int(5) NOT NULL AUTO_INCREMENT,
    `name` varchar(20) NOT NULL COMMENT '用户名',
    PRIMARY KEY (`userid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
create table other(
    `otherid` int(5) NOT NULL AUTO_INCREMENT,
    `userid` varchar(20) NOT NULL COMMENT '用户名',
    PRIMARY KEY (`otherid`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin ;
select * from user left join other on user.userid=other.userid;

3.不为不等原则

3.1 不等于导致索引失效,不等于的情况包括(!= 、<、>、not in)

- != 
select * from user where name != 'test'
--特别的:如果是主键,则还是会走索引
select * from user where id != 1
select * from user where user > 'test'
--特别的:如果是主键或索引是整数类型,则还是会走索引
select * from user where id > 123
select * from user where age > 123

4.其他情况

4.1 字段内容为null,导致索引失效

null值实际上是不能参与进建索引的过程。也就是说,null值不会像其他取值一样出现在索引树的叶子节点上。

4.2 or前后条件都包含索引则走索引,or前后有一个不包含索引索引失效

4.3 添加索引的字段上使用函数或者计算,导致索引失效,函数包括ABS,UPPER,DATE,DAY,YEAR等

create index idx_age on user(age);
select * from user where age+1>5;
Logo

本社区面向用户介绍CSDN开发云部门内部产品使用和产品迭代功能,产品功能迭代和产品建议更透明和便捷

更多推荐