IT世界|导致MySQL索引失效的几种常见写法,请看这里( 二 )
单个索引1、使用!= 或者 <> 导致索引失效SELECT * FROM `user` WHERE `name` != '冰峰';
我们给name字段建立了索引 , 但是如果!= 或者 <> 这种都会导致索引失效 , 进行全表扫描 , 所以如果数据量大的话 , 谨慎使用
可以通过分析SQL看到 , type类型是ALL , 扫描了10行数据 , 进行了全表扫描 。 <>也是同样的结果 。
2、类型不一致导致的索引失效在说这个之前 , 一定要说一下设计表字段的时候 , 千万、一定、必须要保持字段类型的一致性 , 啥意思?比如user表的id是int自增 , 到了用户的账户表user_id这个字段 , 一定、必须也是int类型 , 千万不要写成varchar、char什么的骚操作 。
SELECT * FROM `user` WHERE height= 175;
这个SQL诸位一定要看清楚 , height表字段类型是varchar , 但是我查询的时候使用了数字类型 , 因为这个中间存在一个隐式的类型转换 , 所以就会导致索引失效 , 进行全表扫描 。
现在明白我为啥说设计字段的时候一定要保持类型的一致性了不 , 如果你不保证一致性 , 一个int一个varchar , 在进行多表联合查询(eg: 1 = '1')必然走不了索引 。
遇到这样的表 , 里面有几千万数据 , 改又不能改 , 那种痛可能你们暂时还体会 。
少年们 , 切记 , 切记 。
3、函数导致的索引失效SELECT * FROM `user` WHERE DATE(create_time) = '2020-09-03';
如果你的索引字段使用了索引 , 对不起 , 他是真的不走索引的 。
4、运算符导致的索引失效SELECT * FROM `user` WHERE age - 1 = 20;
【IT世界|导致MySQL索引失效的几种常见写法,请看这里】如果你对列进行了(+ , - , * , / , !), 那么都将不会走索引 。
5、OR引起的索引失效SELECT * FROM `user` WHERE `name` = '张三' OR height = '175';
OR导致索引是在特定情况下的 , 并不是所有的OR都是使索引失效 , 如果OR连接的是同一个字段 , 那么索引不会失效 , 反之索引失效 。
6、模糊搜索导致的索引失效SELECT * FROM `user` WHERE `name` LIKE '%冰';
这个我相信大家都明白 , 模糊搜索如果你前缀也进行模糊搜索 , 那么不会走索引 。
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 全部是不走索引的 。 我之前就有误解(丢人了...) 。
推荐阅读
- 刘哥说游戏|国乒四大世界冠军收到国际乒联邀请,将参加世界杯!但却引起争议
- 快了棒棒糖|你知道几种?,世界各国的通用弹药
- 文峥解说|可以变身各种动物,我的世界:恶魔果实满足玩家各种“变身”梦
- 小D传奇解说|裁决骨玉要靠后,传奇世界:龙纹才是王者
- 游戏资讯小驿站|我的世界拔刀剑模组:独特设定!帮助玩家更深入了解刀的制作
- 新华网|专家:我国迎来成为新的世界贸易中心的历史性机遇
- 归处|世界上3个最美丽的火车站-你认为中国最漂亮的是哪个?
- 诗呓|拥有多个世界之最,让人大开眼界,却鲜少人知,贵州超低调的城市
- 央视新闻客户端|世界周刊丨特朗普疫苗计划争议连连美国“十月惊奇”要来了么?
- 人民币|摩根士丹利:人民币10年内将成为世界第三大储备货币