1、带有运算,也就是在where子句中使用=,+,-,!=,<,>这些运算符号。
2、使用not in,in,这些范围运算时,就会导致索引失效产生全表扫描。
注意:在mysql8.0之后是使用 not in 和 in 是走索引的
3、like模糊查询时候,使用%开头的左模糊查询,这样子会导致索引失效。
4、使用or的时候,索引也可能会失效,因为or是一个并集,如果or条件中有一个不是索引,就会导致索引失效。
5、字段类型与sql语句类型不匹配时,也会导致索引失效。
如果列类型是字符串,则sql语句中使用到该列的条件数据就必须用引号引用起来,否则会导致索引失效,原因是mysql会进行隐式的数据类型转换,导致索引失效
id | name |
---|---|
int | String |
# 上面表格是sql字段的类型
select * from 表名 where name=123456
# sql字段name列的类型是String,但是sql语句却是int类型,
# 这时候mysql就会自己将语句转化为
select * from 表名 where name=‘123456’
6、使用函数,当使用函数计算之后,是会导致索引失效的。
# 查询出id左边第一位是9的所有数据
select * from 表名 where left(id,1)=9
7、复合索引违反最左原则时,索引失效。
一条语句查询多个列时,就是复合索引,在使用复合索引的查询的时候必须按照索引顺序从最左列开始匹配查询,不然就会导致索引失效