【mysql】理解一条sql的执行流程

【一】Mysql的架构

在这里插入图片描述

MySQL的架构来说,分成Server 层和存储引擎层,如下是各层的功能如下整理。

【1】server层

在这里插入图片描述

Server 层包括连接器、执行器、优化器、执行器、查询缓存等模块,主要负责的是建立连接、分析和执行SQL。值得注意的点是所有的内置函数(如日期、时间、数学和加密函数)以及所有跨存储引擎的功能(如存储过程、触发器、视图等)都在本层实现。

(1)连接器

客户端访问MySQL服务器的时候,MySQL是基于TCP协议进行传输的所有需要先经过TCP三次握手,当网络连接建立成功后,服务端与客户端之间会建立一个session 会话。建立会话成功之后,Mysql会对登录的用户名和密码进行校验,它会查询自身的用户表信息,如下图所示:
在这里插入图片描述
Mysql判断输入的用户名是否存在,如果存在则会判断输入的密码是否正确。当用户名和密码都验证通过之后Mysql会从连接池中分配一条空闲线程保持与当前客户端的连接。如果此时线程池中没有空闲线程,那么Mysql会创建一条新的工作线程。

连接完成后如果没有后续的动作,这个连接就处于空闲状态,空闲连接在超过最大空闲时间(wait_timeout)之后,连接器会自动将它断开。我们可以通过命令(show VARIABLES like ‘%timeout%’;)查询最大超时时间如下所示:
在这里插入图片描述
一条sql查询结束后,通过命令(show PROCESSLIST;)查询连接的状态信息:
在这里插入图片描述
这里的sleep表示线程处于空闲状态,一个处于空闲状态的连接被服务端主动断开后客户端并不会马上知道,等到客户端在发起下一个请求的时候,才会收到报错。

(2)分析器

分析器是将SQL中的关键字和用户定义的字段提取出来并分析,最终形成一棵解析树。如查询语句(select order_id, user_id from order where id = 1; )形成的分析树如下所示:
在这里插入图片描述
分析的过程包括词法分析和语法分析两种,词法分析是对关键字进行提取,如select、update、delete…这些关键字,假设我们将关键字写错之后查询,如下所示:

selec * from longxia where id = 1;

提示的异常信息:

[42000][1064] You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'selec * from longxia where id = 1' at line 1

语法分析主要是分析SQL中是否有语法错误,假设我们写一个存在错误的语法sql,如下所示:

select * from longxia where id = 1, name = '张三';

提示的异常信息:

[42000][1064] You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use

(3)优化器

分析器处理通过后的sql语句将会交给优化器进行优化,优化器会根据前面生成的解析树生成一系列执行计划,然后根据执行计划匹配最佳索引来找到一条性能最好的执行计划,然后将该执行计划的SQL交给执行器处理。
在这里插入图片描述

优化器优化主要包括逻辑变换、代价优化等等,其中逻辑变换是在关系代数基础上的变换,变换的目的是为了化简sql,前后保证结果一致。主要包括否定消除、等值常量传递、常量表达式计算等等;代价的优化是用来确定当前的sql是否应用索引,应用哪个索引和确定多表连接的顺序等问题,为了能够进行代价优化,需要尝试各种可能的方法从而找到一个代价最小的执行方案。

(4)缓存

缓存主要的作用是提高查询语句的性能,当传来一条查询的sql时,Mysql会先去缓存中查询是否存在该sql对应的执行结果(通过key-value形式缓存的),如果存在,则直接返回sql对应的执行结果;如果不存在,则就以正常的流程执行该sql。

缓存也存在一定的弊端,当缓存中的value记录的数据发生了更改,那么就会删除这条缓存,在写多读少的情况下缓存不仅无法发挥其功效,而且由于操作缓存十分频繁而消耗了Mysql的性能。因此MySQL 8.0后直接将查询缓存的整块功能删掉了。

(5)执行器

执行器负责根据优化器生成的执行计划来执行调用存储引擎执行sql语句并返回结果集。执行器主要功能包括:
①与存储引擎交互:执行器通过调用存储引擎的API来操作数据,执行查询、更新、插入等操作。不同的存储引擎有不同的接口和实现方式,执行器需要与存储引擎紧密配合来确保数据操作的正确性和高效性。
② 权限校验:在执行SQL语句之前执行器会进行权限校验,确保当前用户有权执行该语句。如果权限不足,执行器会返回相应的错误信息。
③ 执行最优的执行计划:根据优化器生成的执行计划,执行器会按照计划逐步执行SQL语句并生成结果集。

【2】存储引擎层

在这里插入图片描述
存储引擎层负责了Mysql中数据的存储和提取,对物理服务器级别维护的底层数据执行操作 ,服务器通过API与存储引擎进行通信。我们可以通过命令(SHOW ENGINES;)查询Mysql支持的存储引擎,如下所示:
在这里插入图片描述
常见的Mysql存储引擎各自的特点整理如下所示:
在这里插入图片描述

所有的存储引擎共用一个Server 层并且索引数据结构是由存储引擎层实现的。查询Mysql默认的引擎的命令:SHOW variables like ‘%engine%’; 查询的结果如下所示:

在这里插入图片描述
其实,自MySQL 5.5版本开始MySQL默认的存储引擎是InnoDB。

【二】sql的执行过程

以Mysql8.0以下的版本为案例,描述Mysql的执行一条sql的流程,执行的流程图如下所示:

在这里插入图片描述
(1)客户端发送一条sql之后,第一步要到连接器上,连接器验证通过后查询缓存(Mysql是key-value形式保存)中是否存在数据,如果缓存中有sql对应的数据,那么直接返回结果即可。

(2)当缓存中没有数据的时候,那么会经过解析器解析语法信息、优化器得出最佳的执行计划,然后拿着执行计划让执行器通过API请求存储引擎,存储引擎请求系统的文件拿到最终的结果并返回给执行器。

(3)执行器将结果缓存到缓存中,然后返回结果给客户端。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值