MYSQL-SQL语句执行过程(简版)

执行过程如图:

image
以select查询语句为例:
客户端->连接层->Server层->Engine层->数据文件

1.客户端

1.客户端发起sql语句

2.连接层

2.连接层接收到客户端的sql请求
3.用户验证
数据库一启动会把mysql.user,mysql.db,mysql.table_priv,mysql.column_priv 
等这些授权表加载到内存,以便与进行用户验证,如:如密码是否过期,用户密码是否正确等。
4.提供连接线程。当与客户端建立连接之后,MySQL会专门生成一个连接线程为这个请求服务。(可通过命令"show processlist;" 查看连接情况 )

3.Server层

5.预处理,server层接收到sql语句后,进行预处理;对语法、语义、权限相关等处理
   语义:select,update,ddl,dcl等操作。
   权限:操作对象的权限。
6.解析,预处理完成之后,对语句进行解析,将语句拆分成多个块,然后用树形结构表示语句的执行逻辑。解析出来的树形结构,称之为AST抽象语法树。
 例如:select id,count(*) from test.t1 where id>1 group by id order by id asc;
 解析过程:from..where..group by..select..order by。 这就是该语句的执行顺序
7.优化,解析树生成之后,进入优化过程。优化分两个阶段:先逻辑优化,再物理优化。	
逻辑优化:基于优化器算法进行优化,根据抽象语法树,进行关系代数的等价转换,例如:sql改写、索引条件顺序调整、关联表的时候先过滤驱动表的条件,然后将结果进行关联。
物理优化:物理优化会参考统计信息内容(统计信息描述数据分布、数据存储、索引相关信息 )及优化器算法(如ICP),最终得出代价最低的执行计划。
8.执行计划:优化完成后,生成执行计划,将语句交给engine层执行。

4.Engien层

9.InnoDB的io线程接收到Server层生成的执行计划,去磁盘文件中获取相关的数据文件,并返回结果

小结:
1.这是sql大致的执行过程,更加详细的可以参考官网文档。
2.此处没考虑MySQL的查询缓存,是因为MySQL的查询缓存命中率低,且影响性能,8.0之后已经废弃了。

posted @ 2021-12-10 16:48  红桃Z  阅读(361)  评论(0编辑  收藏  举报