1、没有遵循索引最左原则。
建立几个复合索引字段,最好就用上几个字段。
2、最佳左前缀法则
如果索引了多列,要遵守最左前缀法则,指的是查询从索引的最左前列开始,可以跳过但是尽量不跳过索引中间的列。
3、不再索引列上做任何操作(计算、函数、(自动or手动)类型转换),会导致索引失效而转向全表扫描
4、存储引擎不能使用索引中范围条件右边的列。(范围之后全失效)
若中间索引列用到了范围(>、<、like等),则后面的索引全失效
范围 若有索引则能使用到索引,范围条件右边的索引会失效(范围条件右边与范围条件使用的同一个组合索引,右边的才会失效。若是不同索引则不会失效)
5、Mysql在使用不等于(!=、<>)或like的左模糊的时候无法试用索引会导致全表扫描
6、IS NULL和IS NOT NULL也无法使用索引
7、字符串不加单引号索引失效,因为这里有一个隐式的类型转换操作,更严重会导致行锁变表锁,降低SQL效率
8、or,用它来连接时会索引失效,所有索引都失效 要想使用or,又想让索引生效,只能将or条件中的每个列都加上索引
假设index(a,b,c)
Where语句
索引是否被使用
where a = 3
Y,使用到a
where a = 3 and b = 5
Y,使用到a,b
where a = 3 and b = 5 and c = 4
Y,使用到a,b,c
where b = 3 或者 where b = 3 and c = 4 或者 where c = 4
N
where a = 3 and c = 5
使用到a, 但是c不可以,b中间断了
where a = 3 and b > 4 and c = 5
使用到a和b, c不能用在范围之后,b后断了
where a = 3 and b like 'kk%' and c = 4
Y,使用到a,b,c
where a = 3 and b like '%kk' and c = 4
Y,只用到a
where a = 3 and b like '%kk%' and c = 4
Y,只用到a
where a = 3 and b like 'k%kk%' and c = 4
Y,使用到a,b,c
mysql索引失效的几种情况
最新推荐文章于 2024-09-25 18:17:58 发布