IT世界|导致MySQL索引失效的几种常见写法,请看这里( 二 )

单个索引1、使用!= 或者 <> 导致索引失效SELECT * FROM `user` WHERE `name` != '冰峰';我们给name字段建立了索引 , 但是如果!= 或者 <> 这种都会导致索引失效 , 进行全表扫描 , 所以如果数据量大的话 , 谨慎使用
IT世界|导致MySQL索引失效的几种常见写法,请看这里可以通过分析SQL看到 , type类型是ALL , 扫描了10行数据 , 进行了全表扫描 。 <>也是同样的结果 。
2、类型不一致导致的索引失效在说这个之前 , 一定要说一下设计表字段的时候 , 千万、一定、必须要保持字段类型的一致性 , 啥意思?比如user表的id是int自增 , 到了用户的账户表user_id这个字段 , 一定、必须也是int类型 , 千万不要写成varchar、char什么的骚操作 。
SELECT * FROM `user` WHERE height= 175;这个SQL诸位一定要看清楚 , height表字段类型是varchar , 但是我查询的时候使用了数字类型 , 因为这个中间存在一个隐式的类型转换 , 所以就会导致索引失效 , 进行全表扫描 。
IT世界|导致MySQL索引失效的几种常见写法,请看这里现在明白我为啥说设计字段的时候一定要保持类型的一致性了不 , 如果你不保证一致性 , 一个int一个varchar , 在进行多表联合查询(eg: 1 = '1')必然走不了索引 。
遇到这样的表 , 里面有几千万数据 , 改又不能改 , 那种痛可能你们暂时还体会 。
少年们 , 切记 , 切记 。
3、函数导致的索引失效SELECT * FROM `user` WHERE DATE(create_time) = '2020-09-03';如果你的索引字段使用了索引 , 对不起 , 他是真的不走索引的 。
IT世界|导致MySQL索引失效的几种常见写法,请看这里4、运算符导致的索引失效SELECT * FROM `user` WHERE age - 1 = 20;【IT世界|导致MySQL索引失效的几种常见写法,请看这里】如果你对列进行了(+ , - , * , / , !), 那么都将不会走索引 。
IT世界|导致MySQL索引失效的几种常见写法,请看这里5、OR引起的索引失效SELECT * FROM `user` WHERE `name` = '张三' OR height = '175';OR导致索引是在特定情况下的 , 并不是所有的OR都是使索引失效 , 如果OR连接的是同一个字段 , 那么索引不会失效 , 反之索引失效 。
IT世界|导致MySQL索引失效的几种常见写法,请看这里6、模糊搜索导致的索引失效SELECT * FROM `user` WHERE `name` LIKE '%冰';这个我相信大家都明白 , 模糊搜索如果你前缀也进行模糊搜索 , 那么不会走索引 。
IT世界|导致MySQL索引失效的几种常见写法,请看这里7、NOT IN、NOT EXISTS导致索引失效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 全部是不走索引的 。 我之前就有误解(丢人了...) 。


推荐阅读