MySQL 内部优化特性:索引下推

欢迎关注公众号 【11来了】 ,持续 MyBatis 源码系列内容!

在我后台回复 「资料」 可领取编程高频电子书

在我后台回复「面试」可领取硬核面试笔记

文章导读地址:点击查看文章导读!

感谢你的关注!

MySQL 内部优化特性:索引下推

索引下推 指的是对于 where 条件的筛选从 MySQL 的服务器层下推到存储引擎层,这样在存储引擎层可以直接筛选数据,减少回表次数

如果没有索引下推,检索数据的流程为:

1、根据索引读取对应的索引记录,读取到叶子节点中的主键值,根据主键值回表查询

2、通过回表拿到完整记录后,再去判断记录是否符合 where

在引入了索引下推之后,检索数据的流程变为:

1、根据索引读取对应的索引记录

2、先对判断对应的索引字段是否符合 where 条件,如果不符合 where 条件,就不需要回表查询了

3、对于符合 where 条件的数据,再回表查询完整记录,判断其他的非索引项是否符合 where 条件

索引下推场景:

  • 对于联合索引(a,b),如果对于索引列 a 使用范围查询,那么后边的索引列 b 会失效,在这种情况下,通过索引下推不仅会通过索引列 a 来筛选 where 条件的字段,还会通过索引列 b 来筛选 where 条件的字段
  • 对于联合索引(a,b),如果根据索引列 a 查询的选择性很低,而由于其他的一些原因导致索引列 b 失效,这种情况下,通过索引下推可以将索引列 a 和 b 的值与 where 条件对比,来提前完成对索引数据的筛选

注意: 这里索引下推判断时,在存储引擎层只可以判断索引列的字段,因为非索引列必须通过回表查询才可以拿到对应的数据

索引下推案例:

如下 SQL:

sql 复制代码
-- 联合索引:(name, age, positioni)
SELECT * FROM employees WHERE name like 'LiLei%' AND age = 22 AND position ='manager';

对上面这条 sql 语句就是用了 索引下推 ,经过索引下推优化后,在联合索引(name,age,position)中,匹配到名字是 LiLei 开头的索引之后,同时还会在索引中过滤 age、position 两个字段的值是否符合,最后会拿着过滤完剩下的索引对应的主键进行回表,查询完整数据

(MySQL5.6 之前没有索引下推,因此匹配到 name 为 LiLei 开头的索引之后,会直接拿到主键,进行回表查询)

索引下推总结:

  • 索引下推可以有效减少回表次数
  • 对于 InnoDB 引擎的表,索引下推只能用于二级索引,因为 InnoDB 的主键索引的叶子节点存储的是全行数据,如果在主键索引上使用索引下推并不会减少回表次数
相关推荐
TDengine (老段)5 小时前
TDengine 数学函数 DEGRESS 用户手册
大数据·数据库·sql·物联网·时序数据库·iot·tdengine
TDengine (老段)5 小时前
TDengine 数学函数 GREATEST 用户手册
大数据·数据库·物联网·时序数据库·iot·tdengine·涛思数据
@yanyu6665 小时前
idea中配置tomcat
java·mysql·tomcat
安当加密5 小时前
云原生时代的数据库字段加密:在微服务与 Kubernetes 中实现合规与敏捷的统一
数据库·微服务·云原生
爱喝白开水a6 小时前
LangChain 基础系列之 Prompt 工程详解:从设计原理到实战模板_langchain prompt
开发语言·数据库·人工智能·python·langchain·prompt·知识图谱
想ai抽6 小时前
深入starrocks-多列联合统计一致性探查与策略(YY一下)
java·数据库·数据仓库
武子康6 小时前
Java-152 深入浅出 MongoDB 索引详解 从 MongoDB B-树 到 MySQL B+树 索引机制、数据结构与应用场景的全面对比分析
java·开发语言·数据库·sql·mongodb·性能优化·nosql
longgyy6 小时前
5 分钟用火山引擎 DeepSeek 调用大模型生成小红书文案
java·数据库·火山引擎
ytttr8737 小时前
C# 仿QQ聊天功能实现 (SQL Server数据库)
数据库·oracle·c#
盒马coding7 小时前
第18节-索引-Partial-Indexes
数据库·postgresql