- like 以%开头,索引无效;当like前缀没有%,后缀有%时,索引有效。
- or语句前后没有同时使用索引。当or左右查询字段只有一个是索引,该索引失效,只有当or左右查询字段均为索引时,才会生效
- 组合索引,不是使用第一列索引,索引失效。
- 数据类型出现隐式转化。如varchar不加单引号的话可能会自动转换为int型,使索引无效,产生全表扫描。
- 在索引列上使用 IS NULL 或 IS NOT NULL操作,索引不一定失效!!!
MySQL中IS NULL、IS NOT NULL、!=不能用索引?胡扯!
MySQL中NULL对索引的影响 - 简书
- 在索引字段上使用not,<>,!=。不等于操作符是永远不会用到索引的,因此对它的处理只会产生全表扫描。 优化方法: key<>0 改为 key>0 or key<0。 (实践了,这个情况不一定不走索引,根据查询成本决定)
- 对索引字段进行计算操作、字段上使用函数。(索引为 emp(ename,empno,sal))
- 当全表扫描速度比索引速度快时,mysql会使用全表扫描,此时索引失效。
- 不在索引列上做任何操作(计算、函数、(自动or手动)类型转换),会导致索引失效而转向全表扫描
- 存储引擎不能使用索引范围条件右边的列
- 尽量使用覆盖索引(只访问索引的查询(索引列和查询列一致)),减少select *
- mysql在使用不等于(!=或者<>)的时候无法使用索引会导致全表扫描
- is null,is not null也无法使用索引
- like以通配符开头(’%abc…’)mysql索引失效会变成全表扫描的操作。
重点解释下为什么存储引擎不能使用索引范围条件右边的列
- 索引项是按照索引定义里面出现的字段顺序排序的。
- 只要满足最左前缀,就可以利用索引来加速检索。这个最左前缀可以是联合索引的最左 N 个字段,也可以是字符串索引的最左 M 个字符。
15个必知的Mysql索引失效场景,别再踩坑了! | HeapDump性能社区实践中not in和not exists可以走索引。