SQL执行流程

1.1MySQL中的SQL执行流程

MySQL的查询流程:

1、查询缓存:Server如果在查询缓存中发现了这条SQL语句,就会直接将结果返回给客户端;如果没有,就进入到解析器阶段。需要说明的是,因为查询缓存往往效率不高,所以在MySQL8.0以后就抛弃了这个功能(两个SQL需要完全一样,包括空格、注释、大小写都必须一样)

2、解析器:在解析器中对SQL语句进行语法分析、语义分析

3、优化器:在优化器中会确定SQL语句的执行路径,比如是根据全表检索,还是根据索引检索等。

一条查询可以有很多种执行方式,最后都返回相同的结果。优化器的作用就是找到这其中最好的执行计划。

比如:优化器是在表里面有多个索引的时候,决定使用哪个索引;或者在一个语句有夺标关联(join)的时候,决定各个表的连接顺序,还有表达式简化、子查询转为连接、外连接转为内连接等。

举例:如下语句是执行两个表的join:

select * from test1 join test2 using(ID) where test1.name='zhangwei' and test2.name='mysql';

方案1:可以先从表test1里取出name='zhangwei'的记录的ID值,再根据ID值关联到表test2,再判断test2立马name的值是否等于'mysql'。

方案2:可以先从表test2里面取出name='mysql'的记录的ID值,再根据ID值关联到test1,再判断test1里面name的值是否等于'zhangwei'。

这两种执行方法的逻辑结果是一样的,但是执行的效率会有不同,而优化器的作用就是决定选择使用哪一个方案。优化器阶段完成后,这个语句的执行方案就确定下来了,然后进入执行器阶段。

在查询优化器中,可以分为逻辑查询优化阶段和物理查询优化阶段。

逻辑查询优化就是通过改变SQL语句的内容来使得SQL查询更高效,同时为物理查询优化提供更多的候选执行计划。通常采用的方式是对SQL语句进行等价变换,对查询进行重写,而查询重写的数学基础就是关系代数。对条件表达式进行等价谓词重写、条件简化,对视图进行重写,对子查询进行优化,对连接语义进行了外连接消除、嵌套连接消除等。

物理查询优化是基于关系代数进行的查询重写,而关系代数的每一步都对应着物理计算,这些物理计算往往存在多种算法,因此需要计算各种物理路径的代价,从中选择最小的作为执行计划。在这个阶段里,对于单表和多表连接的操作,需要高效的使用索引,提升查询效率。

4、执行器

截止到现在,还没有真正地去读写真实的表,只是产出了个执行计划。于是就进入了执行器阶段

在执行之前需要判断该用户是否具备权限。如果没有,就会返回权限错误。如果具备权限,就执行SQL查询并返回结果。在MySQL8以下的版本,如果设置了查询缓存,这时会将查询结果进行缓存。

如果有权限,就打开表继续执行。打开表的时候,执行器就会根据表的引擎定义,调用存储引擎API对表进行读写。存储引擎API只是抽象接口,下面还有个存储引擎层,具体实现还是要看表选择的存储引擎。

posted @ 2022-01-24 19:55  阿伦啊  阅读(124)  评论(0编辑  收藏  举报