索引的目的是为了加快数据库查询数据的速度, 是帮助数据库高效获取数据的数据结构
但是在很多情况下,如果不注意一下几种情况,很容易导致索引的功能失效,无法加快数据查询的速度

1.复合索引使用时遵循最左匹配原则,如果不是从最左列开始时,整个索引失效 (单独引用复合索引里非第一位置的索引列)
比如复合索引为 a,b,c (重点说明,索引的字段顺序很重要,包括查询时候的顺序,不能跨列使用,保持索引的定义和使用的顺序一致性)
一下情况索引会失效

select * from table where b='xxx' and c='xxx' 

但是如果是下面这样,索引是有效的

select * from table where a='xxx' and b='xxx' 
select * from table where a='xxx' and b='xxx' and c='xxx'

索引可能因为SQL优化器有效(注意是可能)

select * from table where c='xxx' and b='xxx' and a='xxx' 

2.隐式转换导致索引失效(索引字段为varchar类型,但是存储的是number类型)
索引会失效

select * from table where a=111 

索引生效

select * from table where a='111' 

3.对索引列运算,运算包括(+,-,*,/,!,<>,!= ,% ,like’%_’(%放在前面),or,in,exist,is null,等),导致索引失效

select * from table where a like '%xxx' 
select * from table where a='xxx' or b='xxx'
select * from table where a!='xxx' and b='xxx'

4.在索引字段做算术计算和,函数计算,类型转换

select * from table where a+1=0

5.如果MySQL预计使用全表扫描要比使用索引快,则不使用索引 (SQL优化器)