首先说说索引的分类:
按照物理存储结构划分:聚簇索引、非聚簇索引
按照索引的数据结构划分: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。此篇之分享索引下推相关知识,其他额外内容不做细致分享,请各位朋友自行了解
标签:语句,存储,说一说,下推,索引,引擎,sql,MySQL,执行 From: https://blog.csdn.net/qq_74212030/article/details/140559371