mysql索引失效的几种情况
mysql索引失效的几种情况。遵循最左前缀原则、字符匹配原则、不为不等原则、和其他情况
·
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;
更多推荐
已为社区贡献1条内容
所有评论(0)