MySQL中什么情况下会出现索引失效?如何排查索引失效?
创作时间:
作者:
@小白创作中心
MySQL中什么情况下会出现索引失效?如何排查索引失效?
引用
CSDN
1.
https://blog.csdn.net/weixin_44382896/article/details/138202372
1-引言:什么是MySQL的索引失效?(What、Why)
1-1 索引失效定义
- 在MySQL中,索引是用来加快检索数据库记录的一种数据结构。
- 索引失效指的是在进行查询操作时,本应该使用索引来提升查询效率的场景下,数据库没有利用索引,而是采用了全表扫描的方式,这会大大增加查询时间和系统负担。
1-2 为什么排查索引失效
排查索引失效的原因是至关重要的,主要有以下方面:
- 1. 提高查询效率:索引的主要目的是加快数据检索速度。当索引失效时,数据库系统可能退回到更慢的查询方法,如全表扫描,这会显著增加查询时间和降低整体性能。
- 2. 降低服务器负载:使用索引可以显著减少数据库处理查询所需处理的数据量,从而减少CPU使用率和IO读写。如果索引失效,数据库必须加载更多数据,这会增加服务器的负载和资源消耗。
2- 索引失效的原因及排查(How)
2-1 索引失效的情况
- 以以下的学生信息表举例
CREATE TABLE `student_info` (
`student_id` int(11) NOT NULL AUTO_INCREMENT,
`student_name` varchar(50) NOT NULL,
`student_age` int(11) DEFAULT NULL,
`enrollment_date` datetime DEFAULT NULL,
PRIMARY KEY (`student_id`),
UNIQUE KEY `student_name` (`student_name`),
KEY `student_age` (`student_age`),
KEY `enrollment_date` (`enrollment_date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
- 表的索引情况:
- 总结来说,表
student_info有四个字段上定义了索引: - 一个主键索引
student_id - 一个唯一索引
student_name - 以及两个普通索引
student_age和enrollment_date。
① 索引列参与计算
- 正常的通过 age 去做查询
- 走的是
student_age的索引
explain select * from student_info where student_age=21;
- 如果索引列参与了计算进行查询
- 索引失效
explain select * from student_info where student_age+1 =21;
- 如果不是对列进行计算,而是对列等号右侧的值进行计算,结果还是走索引的。
② 对索引列进行函数操作
- 正常的查询——>走索引
explain select * from student_info where enrollment_date = '2022-09-04 08:00:00';
- 如果对查询的字段加上函数操作时,索引失效
explain select * from student_info where YEAR(enrollment_date) = 2022;
③ 查询中使用了 OR 两边有范围查询 > 或 <
- 正常情况查询,查询使用
student_name索引
explain select * from student_info where student_name='Helen' and student_age>15;
- 如果使用了 OR 进行查询,两边包含范围查询 > 或 <
- 此时索引失效
explain select * from student_info where student_name='Helen' or student_age>15;
- 如果没有范围查询下使用 OR 还是正常走索引
explain select * from student_info where student_name='Helen' or student_age=18;
④ like 操作:以 % 开头的 like 查询
- 以 % 开头的 LIKE 查询比如 LIKE ‘%abc’;;
⑤ 不等于比较 !=
- 在MySQL中
!=比较有可能会导致不走索引,但如果对 id 进行!=比较,是有可能走索引的。 !=比较是否走索引,与索引的选择、数据分布情况有关,不单是由于查询包含!=而引起的。
⑥ order by
- 如果使用 order by 时,表中的数据量很小,数据库会直接在内存中进行排序,而不使用索引
⑦ 使用 IN
- 使用
IN的时候,有可能走索引,也有可能不走索引。当在IN的取值范围比较大的时候有可能会导致索引失效,走全表扫描(NOT IN和IN的失效场景相同)。
2-2 索引失效的排查
使用 explain 排查
- 和 MySQL 慢查询的排查类似,使用 Explain 语句来进行排查。
需要关注的字段:type、key、extra
- 我们可以根据 key、type、extra 来判断一条语句是否走了索引。
- 一般走索引的情况 :
- key 值不为 null
- type 值应该为 ref、eq_ref、range、const 这几个
- extra 的话如果是 NULL,或者 using indedx,using index condition 都是可以的
索引失效情况 - 如果一条语句出现了
type
值为
all
、key 为
null
,
extra = Using where
此时是索引失效了
此时就需要排查索引失效的原因
- 索引是否符合最左前缀匹配
- 查询语句出现以上 7 种情况
3- 总结:索引失效知识点小结
MySQL中什么情况下会出现索引失效?如何排查索引失效?
回答
热门推荐
180 Bpm-跑步纯音乐 跳绳专属带感节奏纯音乐
除了发光,萤火虫还有哪些“冷知识”?
姜黄,自然界的抗炎黄金
真正的“马步”练法,是压箱底的好东西,很多老师宁愿挨骂,都不教的!
逾期影响无犯罪记录:信用修复与法律途径
下水道堵塞疏通的最好办法 家居不同下水道堵塞疏通小妙招
十月推番第二弹:✨ 魔法少女小圆:揭开希望与绝望的织锦 ✨
从古欧洲的四大族群变迁,来看看欧洲两千年历史脉络
小病医疗保险报销范围是什么
碳化硅检测全攻略:从化学成分到物理性能
庐山3月免票月怎么玩?超详细旅游线路攻略收好
这些食物长时间不要吃了,小心黄曲霉菌!做好5点预防
黄山三条索道详解:运行时间、票价及特色全攻略
服用对乙酰氨基酚多久能退烧?专家详解其作用机制与注意事项
肩周炎:病因、诊断与治疗全解析
白天上班晚上做主播,00后流行打两份工
常吃“玉米”的人血糖都不会太差,但前提是要吃对
云笔记怎么保存网盘
千斤顶结构设计及其力学性能分析
如何拟定论文的结构提纲
昆明二手房交易陷阱多?这场圆桌派教你如何避坑
青岛启动新一轮“金蓝领”培训项目,助力实体经济高质量发展
拔罐多长时间合适
西南石油大学全国排名(含西南石油大学最强专业解析)
肠胃一到晚上就咕咕叫不停
王者荣耀妲己:人偶的灵魂追寻,控制与输出的双重魅力
趣学设计模式之桥接模式
清朝驯服蒙古的原因,史书将其藏得太深,难怪清朝时蒙古没有南侵
英文学术论文格式有要求?请遵循期刊投稿指南 !
国外学景观设计去哪些院校比较好,最新推荐