1.使用计算函数
select * from students where left(name,1)='张'
失效原因: 在索引上使用计算函数破坏了索引的有序性。
需要注意的是,优化器并不是完全放弃了这一索引,而是可能使用全索引扫描,也即使用EXPLAIN分析后,type字段为index
优化:
select * from students where name like '张%'
2.左模糊或全模糊
select * from students where name like '%月'
并不会完全失效。 覆盖索引下会出现type=index, 也即遍历索引树,再回表查询。 若覆盖索引没有生效会直接type=all
字符串索引会逐个转换成accii码
3.不等于(!=或者<>)
需要在所有数据中按条遍历执行函数判断条件
4.is not null
首先应该明确,表中值为Null的二级索引是存在B+树的最左边的。因此is null肯定会走索引。 如果数据中大部分值都是null ,则此时is not null和!=也会走索引。(因为此时走索引只需直接遍历少量不为null的数据)
5.复合索引没有使用最左面的索引字段
对于联合索引来说, 在B+树中会先按照左边的字段排序,左边字段相同时才会按下一个字段排序,因此如果跳过左侧字段,后面的索引也就失效了。
注意如果联合索引是(A,B,C), 执行where条件是B=10 and A=5时,是可以走索引的, 因为优化器会帮我们将where条件的顺序调整为索引顺序。
另外,当联合索引左侧字段使用范围查询时,后面的索引也会失效。