- 1.like 以%开头,索引无效;当like前缀没有%,后缀有%时,索引有效。
- 2.or语句前后没有同时使用索引。当or左右查询字段只有一个是索引,该索引失效,只有当or左右查询字段均为索引时,才会生效
- 3.组合索引,不是使用第一列索引,索引失效。(联合索引的最左匹配原则)
- 4.数据类型出现隐式转化。如varchar不加单引号的话可能会自动转换为int型,使索引无效,产生全表扫描。(如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不会使用索引),
- 5.在索引列上使用 IS NULL 或 IS NOT NULL操作,索引不一定失效!!!???
- 6.在索引字段上使用not,<>,!=。不等于操作符是永远不会用到索引的,因此对它的处理只会产生全表扫描。 优化方法: key<>0 改为 key>0 or key<0。
- 7.对索引字段进行计算操作、字段上使用函数。(索引为 emp(ename,empno,sal))索引失效
- 8.当全表扫描速度比索引速度快时,mysql会使用全表扫描,此时索引失效。
- 9.用 != 或者 <> 导致索引失效
- 10.字段类型不一致导致的索引失效
- 11.字段编码类型不一致进行关联查询不走索引;如:SELECT * FROM a表 inner join b表 on a表.A字段=b表.B字段 ’;如果a表的A字段编码类型是utf8,b表B字段编码类型是utf8mb4,这是不走索引的。
- 12.函数导致的索引失效;如:SELECT * FROM table WHERE DATE(create_time) = ‘2021-09-03’;如果使用函数在索引列,这是不走索引的。
- 13.运算符导致的索引失效;如:SELECT * FROM table WHERE height/100 = 20;如果你对列进行了(+,-,*,/,!), 那么都将不会走索引。
- 14.OR引起的索引失效;如:SELECT * FROM table WHERE name = ‘张三’ OR height = ‘175’;OR导致索引是在特定情况下的,并不是所有的OR都是使索引失效,如果OR连接的是同一个字段,那么索引不会失效,反之索引失效。
- 15.模糊搜索导致的索引失效;如:SELECT * FROM table WHERE name LIKE ‘%五’;当%放在匹配字段左边是不走索引的,SELECT * FROM table WHERE name LIKE ‘张%’;放在右边才会走索引。
- 16.NOT IN、NOT EXISTS导致索引失效
- 17.联合索引不遵循最左前缀
- 18.在索引字段上进行操作
- 19.隐士的类型转化 比较VARCHAR 类型不加‘ ’
- 20.在使用 in or 同一个索引字段时 可能不能走索引 这要根据表的大小 等因素来看是否会走索引
- 21.范围查询 大于 小于 没走索引原因:mysql内部优化器会根据检索比例、表大小等多个因素整体评估是否使用索引。比如这个例子,可能是由于单次数据量查询过大导致优化器最终选择不走索引,优化方法:可以将大的范围拆分成多个小范围
关于索引失效的情况
于 2023-08-29 16:56:26 首次发布