1. like 以%开头,索引无效;当like前缀没有%,后缀有%时,索引有效。
    2. or语句前后没有同时使用索引。当or左右查询字段只有一个是索引,该索引失效,只有当or左右查询字段均为索引时,才会生效
    3. 组合索引,不是使用第一列索引,索引失效。
    4. 数据类型出现隐式转化。如varchar不加单引号的话可能会自动转换为int型,使索引无效,产生全表扫描。
    5. 在索引列上使用 IS NULL 或 IS NOT NULL操作,索引不一定失效!!!

    MySQL中IS NULL、IS NOT NULL、!=不能用索引?胡扯!
    MySQL中NULL对索引的影响 - 简书

    1. 在索引字段上使用not,<>,!=。不等于操作符是永远不会用到索引的,因此对它的处理只会产生全表扫描。 优化方法: key<>0 改为 key>0 or key<0。 (实践了,这个情况不一定不走索引,根据查询成本决定)
    2. 对索引字段进行计算操作、字段上使用函数。(索引为 emp(ename,empno,sal))
    3. 当全表扫描速度比索引速度快时,mysql会使用全表扫描,此时索引失效。
    • 不在索引列上做任何操作(计算、函数、(自动or手动)类型转换),会导致索引失效而转向全表扫描
    • 存储引擎不能使用索引范围条件右边的列
    • 尽量使用覆盖索引(只访问索引的查询(索引列和查询列一致)),减少select *
    • mysql在使用不等于(!=或者<>)的时候无法使用索引会导致全表扫描
    • is null,is not null也无法使用索引
    • like以通配符开头(’%abc…’)mysql索引失效会变成全表扫描的操作。

    重点解释下为什么存储引擎不能使用索引范围条件右边的列

    • 索引项是按照索引定义里面出现的字段顺序排序的。
    • 只要满足最左前缀,就可以利用索引来加速检索。这个最左前缀可以是联合索引的最左 N 个字段,也可以是字符串索引的最左 M 个字符。

    15个必知的Mysql索引失效场景,别再踩坑了! | HeapDump性能社区实践中not in和not exists可以走索引。