导致mysql索引失效的几种写法

人生若只如初见,何事秋风悲画扇

使用!= 或者 <> 导致索引失效

1
SELECT * FROM user WHERE name` != '冰峰';

我们给name字段建立了索引,但是如果!= 或者 <> 这种都会导致索引失效,进行全表扫描,所以如果数据量大的话,谨慎使用

类型不一致导致的索引失效

1
SELECT * FROM user` WHERE height= 175;

height表字段类型是varchar,但是我查询的时候使用了数字类型,因为这个中间存在一个隐式的类型转换,所以就会导致索引失效,进行全表扫描。

函数导致的索引失效

1
SELECT * FROM user` WHERE DATE(create_time) = '2020-09-03';

如果你的索引字段使用了索引,对不起,他是真的不走索引的

运算符导致的索引失效

1
SELECT * FROM user` WHERE age - 1 = 20;

OR引起的索引失效

1
SELECT * FROM user WHERE name` = '张三' OR height = '175';

OR导致索引是在特定情况下的,并不是所有的OR都是使索引失效,如果OR连接的是同一个字段,那么索引不会失效,反之索引失效。

模糊搜索导致的索引失效

1
2
3
SELECT s.* FROM user s WHERE NOT EXISTS (SELECT * FROM user u WHERE u.name = s.name AND u.name` = '冰峰')

SELECT * FROM user WHERE name` NOT IN ('冰峰');

这两种用法,也将使索引失效。但是NOT IN 还是走索引的,千万不要误解为 IN 全部是不走索引的。

https://segmentfault.com/a/1190000023911554