mysql一条sql的执行过程_【MySQL深入】一条SQL的执行过程

1.MySQL基本架构示意图

8496cb59665c71b71cf087f2e54aa212.png

MySQL可以分为Server层和存储引擎层两部分

Server层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖MySQL的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。

存储引擎层负责数据的存储和提取。其架构模式是插件式的,支持InnoDB、MyISAM、Memory等多个存储引擎。

2.连接器

定义:连接器主要是和身份认证、权限相关的功能相关。负责跟客户端建立连接、身份认证、获取权限、维持和管理连接。

客户端如果长时间处于空闲状态,连接器就会自动将它断开。这个时间是由参数wait_timeout控制的,默认值是8小时。

连接分为短连接和长连接,因为创建连接的过程比较复杂,所以建议尽量使用长连接,若使用长连接,有时MySQL占用内存涨的很快,可能被系统kill掉(OOM),MySQL5.7及更新版本可在每次执行一个比较大的操作后,通过执行 mysql_reset_connection来重新初始化连接资源。这个过程不需要重连和重新做权限验证,但是会将连接恢复到刚刚创建完时的状态。

3.查询缓存

定义:查询缓存主要是用来缓存我们所执行的SELECT语句以及相关的结果集。在建立连接之后,当执行查询语句的时候,会先查询缓存,如果缓存命中,就会直接从缓存中返回给客户端。

存储形式:缓存是以Key-Value的形式放在内存中,Key是查询语句,Value是结果集。如果查询缓存时没有命中,就会执行后续的操作,完成后也会把结果缓存起来。

注意:查询缓存的失效非常频繁(弊>利),MySQL5.7.26开始弃用查询缓存,MySQL8.0直接删除了查询缓存,详情见官网: Query Cache Configuration Note

4.分析器

定义:当没有缓存命中时会进入分析器,先会做词法分析,然后做语法分析。

词法分析:首先提取关键字,查看是哪种操作,比如 SELECT,然后识别表名、列名等

语法分析:主要判断SQL有没有语法错误,是不是符合MySQL的语法规则。一般语法错误会提示第一个出现错误的额位置,关注紧接“use near”的地方

5.优化器

定义:同一条SQL的执行方法可能有多种,逻辑结果是一样的,但执行的效率会有不同,而优化器的作用就是决定选择使用哪一个方案。

注意:优化器会以它认为最优的执行方案去执行,如果表中有多个索引,优化器会决定使用哪个索引,或者在一个语句有多表关联(join)的时候,决定各个表的连接顺序。

6.执行器

定义:首先会判断有没有权限,若有就打开表继续执行,执行器就会根据表的引擎定义,去使用这个引擎提供的接口。

7.一条示例select语句执行过程分析

SELECT * FROM article WHERE articleId = 112732440 AND title = '【MySQL深入】一条SQL的执行过程';

结合上面的说明,分析这条SQL的执行过程:

先检查权限问题,如果没有权限就直接返回错误信息,如果有权限就会先查询缓存(MySQL 8.0版本之前),以这个sql语句为key,在内存中查询是否有结果,如果有直接返回结果,没有就执行词法分析。

通过分析器先进行词法分析,提取sql语句里面的关键字。以上面的语句为例:首先上面提取的语句是查询语句SELECT,然后提取查询的表名article ,需要查询所有字段,查询条件是articleId = 112732440,title = ‘【MySQL深入】一条SQL的执行过程’。然后进行语法分析,判断sql语句是否正确,检查没问题之后就会执行下一步。

优化器确定执行方案。优化器根据自己的优化算法选择一个执行效率最好的一个方案。确认了执行计划之后就开始准备执行了。

进行权限校验,如果没有权限就会返回错误信息,有权限就会调用数据库引擎接口,返回引擎执行结果。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值