说一说MySQL中的索引下推

首先说说索引的分类:

按照物理存储结构划分:聚簇索引、非聚簇索引
按照索引的数据结构划分:B+树索引、Hash索引、Full-Text索引
按照字段属性划分:主键索引、唯一索引、普通索引
按照字段个数划分:单一索引、联合索引
在MySQl中以InnoDB存储引擎为例,建立的索引默认情况下是B+ Tree 索引

明白了索引的分类及默认索引,我们说说一条sql语句的执行过程

1.连接器

连接器通过TCP和客户端建立连接,并校验客户端传过来的用户名和密码,如果某一项不符合规范则报错。校验通过则获取对应用户的权限,并且在后续的执行过程中,都基于此获取到的权限

2. 查询缓存

如果在查询缓存开启的情况下就会先走查询缓存,如果查询缓存中不存在就继续向下执行
(鉴于此处很麻烦,只阐述大致过程,有兴趣的同学请自行了解)

3. 解析器

sql正式执行之前,MySQL会首先进行词法解析,根据你输入的sql语句识别出关键字来构建语法树,然后进行语法分析,语法解析器会根据语法规则进行合法性校验,如果语句有错误或字段不存在则报错

4. 优化器

经过解析器说明你的sql语句没有问题,此时会进行数据库权限认证,没有对应权限直接凉凉,前功尽弃。通过后则由优化器基于成本考虑来走那个索引(表中有多个索引的情况)

5. 执行器

执行器真正执行

此时重点来了!!!

先说大前提 一定是在联合索引的情况下

表结构如图所示
在这里插入图片描述
执行如下sql语句

SELECT * FROM t_student WHERE 年龄 > 20 AND 分数 = 90;

在使用索引下推的情况下:
在执行器执行的时候,Server层首先调用存储引擎层的接口定位到二级索引处,然后先不执行回表操作, 由存储引擎判断后续的条件(分数 = 90)是否符合条件,如果条件不成立则直接跳过二级索引,如果成立则执行回表操作将记录返回给 Server 层。Server 层再判断其他的查询条件是否成立,如果成立则将结果返回给客户端,否则跳过该记录继续向存储引擎索要记录。直到把存储引擎层的记录都读完

执行explain SELECT * FROM t_student WHERE 年龄 > 20 AND 分数 = 90;语句,得到如下结果:
在这里插入图片描述
注意Extra列看到值为 Using index condition 确实走了索引下推

注:在MySQLInnoDB存储引擎下实验,MySQL版本为8.0.36。此篇之分享索引下推相关知识,其他额外内容不做细致分享,请各位朋友自行了解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值