当前位置:网站首页>可能导致索引失效的原因
可能导致索引失效的原因
2022-07-27 19:57:00 【棒棒吃不胖】
索引主要是为了提高数据的查询效率,但有些情况建立索引反而会降低查询效率,增加成本。
1)数据量级太小。索引本身也会占用一定的空间,数据太少,用索引的意义不大。
2)更新频繁的字段。索引的构建、维护、删除也是要消耗系统资源的。
3)区分度低的字段。比如性别,一般只有两个选择,索引很难仅靠性别查询到想要的数据。
言归正传,可能导致索引失效的原因如下:
假设主键列pri
辅助索引列mul mul1 mul2
没有索引列noidx no_index_col
1)查询条件包含or且字段列不含索引
select * from test where mul=1 or noidx=2;
辅助索引+or+无索引的列:会先走索引列,但无索引的列会进行全表扫描,所以还不如不走索引,直接都全表扫描完事。
如果or前后都有索引,那么可能走索引,也可能不走索引。
2)隐式转换导致索引失效
假设某手机号列创建时是num varchar(15)
在查询时,where条件列后面跟的是字符串,要带引号
select * from test where num='13911111111';
如果不带引号,就是数字,字符类型不匹配,不走索引。
3)like且%为前缀的非覆盖索引
%在前面,不走索引
select * from test where mul like "%abc";
%不在前面,走索引
select * from test where mul like "abc%";
使用覆盖索引,%在前面,也走索引
select pri,mul from test where mul like "%abc";
4)创建联合索引且查询时不满足最左匹配原则,索引可能失效,也可能依旧有效。索引失效的例子很多,这里演示一个例子,表示索引依旧有效。
注意我创建的联合索引,name在前,id在后。
CREATE TABLE a(
id INT NOT NULL,
NAME VARCHAR(5)
)ENGINE=INNODB,CHARSET=utf8
ALTER TABLE a ADD INDEX idx_name_id(NAME,id);
获取执行计划:
DESC SELECT * FROM a WHERE NAME='a' AND id <2;

获取执行计划:
DESC SELECT * FROM a WHERE id <2 AND NAME='a';

获取执行计划:
DESC SELECT * FROM a WHERE id =3;

5)对索引的列进行数值运算,索引失效
CREATE TABLE `user`(
`id` INT(11) NOT NULL AUTO_INCREMENT,
`userId` VARCHAR(32) NOT NULL,
`age` INT(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_age`(`age`) USING BTREE
)ENGINE=INNODB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
获取索引执行计划:
DESC SELECT * FROM USER WHERE age+1=8;

6)索引中使用不等于的符号,索引可能失效
包括<> != not in
需要注意的是,如果是聚集索引列,使用以上符号,依旧会走索引。
7)用or连接的两个含null索引字段,不走索引。
例如:
select * from test where mul1 is null or mul2 is not null;
但是,单个索引含null字段,是走索引的。
select * from test where mul1 is null;
8)没有查询条件,或者查询条件的列没有索引,则不走索引
例如:
select * from test;
select * from test where no_index_col=3;
9)Mysql的优化器分析认为全表扫描比走索引更快的时候,比如查询的结果集不小于总数据25%-30%时,其认为没必要走索引了。
10)索引自身失效。
虽然索引有自我维护的能力,但数据表内容修改和更新频繁的情况下,也有可能索引失效,此时需要删除索引,重新建立索引。
参考文章:
边栏推荐
- What is private traffic?
- 带你掌握 Makefile 分析
- US officials suggested trump prevent Infineon from acquiring cypress
- OPPO Find X2系列发布:3K+120Hz曲面屏,DXO评分第一,顶配版6999元!
- Leetcode-55-jump game
- 【图解】三次握手,四次挥手 —— 用心看这一篇就够了
- RN搜索高亮显示
- Excel only wants to visualize charts and make data move? Yes, come and watch (with a large number of templates to download)
- SQL注入 Less29(参数污染绕过WAF)
- High frequency relay
猜你喜欢

setContentView详解

Two dimensional code generation based on MCU and two dimensional code display on ink screen

When type= 'number' is set in the input field, remove the up and down buttons behind it
C语言详解系列——函数的认识(5)函数递归与迭代

leetcode15--三数之和

What is private traffic?

【图解】三次握手,四次挥手 —— 用心看这一篇就够了

一篇搞定Redis中的BigKey问题

Video human behavior detection

Vocational school Panyun network security competition ----- exploration of hidden information
随机推荐
2022/5/17考试总结
HC32F4A0 时钟控制
The follow-up is coming. Whether it's OK without reference, let's make it clear to everyone at once!
美国疫情扩散到28个州:苹果、微软等10多万员工在家办公,iPhone11快断货了!
美国官员建议特朗普阻止英飞凌收购赛普拉斯
Redis learning
[binary tree] count the number of good nodes in the binary tree
Setcontentview details
Tab bar (addeventlistener and onclick practice, used with bind method, exponential growth to listen for events)
US officials suggested trump prevent Infineon from acquiring cypress
Solid state relay
Leetcode-55-jump game
一篇搞定Redis中的BigKey问题
中芯国际购买的ASML光刻机顺利进厂,但并未非EUV光刻机!
Window localStorage 属性和Location 对象
Project management tool Zen
三星存储工厂又发生火灾!
格力口罩来了!KN95口罩只要5.5元一个!
SQL injection less26a (Boolean blind injection)
Reed relay