0
点赞
收藏
分享

微信扫一扫

MySQL内核(一条sql语句的执行流程) -- 学习笔记

云上笔记 2022-04-24 阅读 65
sqlmysql

MySQL内核(一条sql语句的执行流程)

MySQL整体架构

以下为MySQL数据库中SQL语句在的简要执行流程

在这里插入图片描述

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

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

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

Server层

1.连接器

客户端想要对数据库进行操作时,连接器就是用来负责跟客户端建立连接、获取权限、维持和管理连接的。

连接器支持短连接也支持长连接,同时为了避免频繁创建和销毁连接造成性能损失,可选择利用连接池进程管理

2.查询缓存

查询缓存主要用来缓存我们所执行的 select语句以及该语句的结果集。

如果开启了查询缓存,执行查询语句的时候,会先查询缓存。如果缓存 key 被命中,就会直接返回给客户端。在数据变换频繁的表中,是不推荐使用的,当一张表的数据发生变化,其所有缓存都将清空。

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

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

3.分析器

分析器的工作主要是对要执行的SQL语句进行解析,最终得到抽象语法树。

一、词法分析。提取关键字(Token),比如 select,提出查询的表,提出字段名,提出查询条件等等

二、语法分析。把提取出的Token转换为抽象语法树后进行检验。主要就是判断你输入的 sql 是否正确,是否符合 MySQL 的语法

4.优化器

优化器会找出执行该语句所有可能使用的方案,然后选择一条最优查询路径,即MySQL认为的效率最高的方式,并生成执行计划。比如你一个表中创建了多个索引,优化器会根据IO和CPU成本,选出代价最小的索引进行执行

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

5.执行器

根据执行计划完成SQL语句的操作,执行前会校验该用户有没有权限,如果没有权限,就会返回错误信息,如果有权限,就会去调用引擎的接口,返回接口执行的结果。

存储引擎层

存储引擎是对底层物理数据执行实际操作的组件,为Server层提供各种操作数据的 API,数据是被存放在内存或者是磁盘中的。

以InnoDB为例

InnoDB存储引擎整体分为内存架构(Buffer Pool缓冲池)和磁盘架构(undolog和redolog)

缓冲池(BUffer Pool)

起到一个缓存的作用。MySQL 的数据最终是存储在磁盘中的,如果没有 Buffer Pool,那么每次的数据库请求都会磁盘中查找,这样必然会存在 IO 操作。但是有了 Buffer Pool,只有第一次在查询的时候会将查询的结果存到 Buffer Pool 中,这样后面再有请求的时候就会先从缓冲池中去查询,如果没有再去磁盘中查找,然后在放到 Buffer Pool 中.

一条SQL查询语句的执行过程

select user_id、username from t_user where username = "张三" and sex = 1

1、客户端发起查询请求,与连接器建立连接,连接器确定用户是否有查询权限,没有权限,直接返回错误信息,有执行下一步。

2、查询缓存(MySQL8.0 以前),以这条SQL语句为key在内存缓冲池中是否有结果,有直接返回结果,无则执行下一步。

3、分析器进行词法分析,提取出操作为select, 表名为 t_user, 查询字段为user_id、username,查询条件为username=“张三” 和 sex=1 ,把提取的Token转换为抽象语法树.如下图

请添加图片描述

语法分析,接下来判断这个 sql 语句是否有语法错误,比如关键词是否正确等等,如果检查没问题就执行下一步。

SQL执行顺序

请添加图片描述

4、优化器列出可能的执行方案

a. 先查询t_user表中username=“张三”的学生,然后判断是否性别为男。
b. 先找出学生中性别是男的学生,然后再查询username为“张三”的学生。

优化器确定执行方案:优化器根据自己的优化算法选择一个执行效率最好的一个方案。

(优化器会根据IO和CPU成本,选出代价最小的索引进行执行)

5、执行器进行权限校验(用户对该表是否有查询的权限),如果没有权限就会返回错误信息,如果有权限就执行器会调用数据库引擎接口,返回引擎的执行结果。

6、执行引擎根据执行计划查询数据,并把结果集返回客户端

总结流程

权限校验—》查询缓存—》分析器—》优化器—》权限校验—》执行器—》引擎

一条SQL更新语句的执行过程

update `article` set `commentcnt` = `commentcnt` + 1 where `id` = 2;
  1. 连接器会先检查权限,若没有权限就直接返回错误信息,如果有权限就会清除查询缓存(MySQL 8.0版本之前),将article表所有缓存结果都清空(一般不建议使用查询缓存)。接下来执行下一步。
  2. 通过分析器先进行词法分析,提取sql语句里面的关键字。示例SQL取的update,然后提取要更新的表名article ,更新条件是id= 2 ,然后进行语法分析,判断sql语句是否正确,如果有错会返回报错信息,否则执行下一步。
  3. 优化器确定执行方案。优化器根据自己的优化算法选择一个执行效率最好的一个方案。比如:优化器会去找id字段有没有索引,使用id主键索引,执行计划确定后就会执行下一步。
  4. 执行器首先会判断当前用户对article表是否有更新的权限,如果没有权限就会返回权限错误,若有权限会打开表执行,根据表的引擎定义调用引擎提供的接口,返回引擎执行结果。

与查询SQL流程不同的是,更新SQL流程还涉及两个重要的日志模块redo log 和 binlog

简单介绍MYSQL日志

undolog

undolog记录的是数据被操作前的样子,用于数据事务提交后的事务回滚,保证事务数据原子性;

redolog(InnoDB特有)

redolog记录的是数据被操作后的样子,保证即使MySQL发生了异常重启,数据也能恢复,即保证事务数据一致性

redo log记录的是“在某个数据页上做了什么修改”,是InnoDB引擎特有的日志。

binlog(归档日志)

定义:server层日志,是逻辑日志,记录语句的原始逻辑,比如“给ID=2这一行的c字段加1 ”

特点:可以追加写入,即 binlog 文件写到一定大小后会切换到下一个binlog文件,并不会覆盖以前的日志。

请添加图片描述

更新SQL执行流程:

  • 连接数据库,清空查询缓存(MySQL8.0之前),分析词法和语法后知道这是一条update语句,优化器决定使用ID这个索引

  • 执行器先找引擎取 ID=2 这一行数据。(ID 是主键,引擎直接用树搜索找到这一行。)

  • 如果 ID=2 这一行所在的数据页本来就在内存中,就直接返回给执行器,否则,需要先从磁盘读入内存,然后再返回。

  • 执行器拿到引擎给的行数据,把这个值加上 1,比如原来是 N,现在就是 N+1,得到新的一行数据,再调用引擎接口写入这行新数据。

  • innoDB引擎将这行新数据更新到内存中,同时将这个更新操作记录到 redo log 里面,此时 redo log 处于 prepare 状态。然后告知执行器执行完成了,随时可以提交事务。

  • 执行器生成这个操作的 binlog,并把 binlog 写入磁盘。

  • 执行器调用引擎的提交事务接口,引擎把刚刚写入的 redo log 改成提交(commit)状态,更新完成

参考文章:
https://blog.csdn.net/baiye_xing/article/details/112732440
https://blog.csdn.net/qq_43618881/article/details/118657040
仅作为学习分享

举报

相关推荐

0 条评论