文章目录

  • 1.MYSQL基础架构
  • 2.连接器
  • 3.查询缓存
  • 4.解析SQL
  • 5.执行SQL
  • 5.1 预处理器
  • 5.2 优化器
  • 5.3 执行器
  • 6.总结


1.MYSQL基础架构

mysqlq语句块语法 mysql执行语句块_SQL

  • 连接器:建立连接、管理链接、校验用户身份
  • 查询缓存: 查询语句如果命中查询缓存则直接返回,否则继续往下执行。(MYSQL8.0已删除该模块)
  • 解析器:通过对SQL查询语句进行词法分析、语法分析,然后构建语法树,方便后续模块读取表名、字段、语句类型。
  • 预处理器:检查表或字段是否存在,将select * 中的*扩展为表上的所有列。
  • 优化器:基于查询成本的考虑,选择查询成本最小的执行计划。
  • 执行器:根据执行计划执行SQL语句,从存储引擎读取记录,返回给客户端。

我们可以将MYSQL的架构分为两层:server层和存储引擎层

  • Server层:负责建立连接、分析和执行SQL。MySQL 大多数的核心功能模块都在这实现,主要包括连接器,查询缓存、解析器、预处理器、优化器、执行器等。另外,所有的内置函数(如日期、时间、数学和加密函数等)和所有跨存储引擎的功能(如存储过程、触发器、视图等。)都在 Server 层实现。
  • 存储引擎层:负责数据的存储和提取。支持 InnoDB、MyISAM、Memory 等多个存储引擎,不同的存储引擎共用一个 Server 层。现在最常用的存储引擎是 InnoDB,从 MySQL 5.5 版本开始, InnoDB 成为了 MySQL 的默认存储引擎。我们常说的索引数据结构,就是由存储引擎层实现的,不同的存储引擎支持的索引类型也不相同,比如 InnoDB 支持索引类型是 B+树 ,且是默认使用,也就是说在数据表中创建的主键索引和二级索引默认使用的是 B+ 树索引。

2.连接器

  • 与客户端进行 TCP 三次握手建立连接;
  • 校验客户端的用户名和密码,如果用户名或密码不对,则会报错;
  • 如果用户名和密码都对了,会读取该用户的权限,然后后面的权限逻辑判断都基于此时读取到的权限;即使在连接的过程中权限被管理员修改了,权限在连接结束之前也不会改变。

3.查询缓存

MySQL服务收到SQL语句后,就会解析出SQL语句的第一个字段,看是什么类型的语句

如果是查询语句(select 语句),MySQL就先去查询缓存里查找缓存数据,看看之前有没有执行过这个命令,这个查询缓存是以key - value 形式来保存的,key 为 SQL 查询语句, value 为 SQL语句查询的结果

如果查询语句命中查询缓存,那么就会直接返回给 value 给客户端。如果查询的语句没有命中查询缓存,那么就要继续往下执行,等执行完后,查询的结果就会存入查询缓存中。

但是这个查询缓存的效果并不是很好,对于更新比较频繁的表,查询缓存的命中率很低的,因为只要一个表有更新操作那么这个表的查询缓存就会被清空,如果刚缓存了一个查询结果很大的数据,还没被使用的时候,刚好这个表有更新操作,查询缓冲就被清空了,相当于缓存了个寂寞。

所以,MySQL 8.0 版本直接将查询缓存删掉了,也就是说 MySQL 8.0 开始,执行一条 SQL 查询语句,不会再走到查询缓存这个阶段了。

4.解析SQL

  1. 词法分析:MySQL根据输入的字符串识别出关键字来构建 SQL 语法树,方便后续模块获取 SQL 类型、表名、字段名、where条件等等
  2. 语法分析:根据词法分析的结果,语法解析器会根据语法规则,判断输入的SQL语句是否满足语法。

5.执行SQL

经过解析器后,接着就要进入执行 SQL 查询语句的流程了,每条SELECT 查询语句流程主要可以分为下面这三个阶段:

  • prepare 阶段,也就是预处理阶段;
  • optimize 阶段,也就是优化阶段;
  • execute 阶段,也就是执行阶段;

5.1 预处理器

  1. 检查 SQL 查询语句中的表或字段是否存在
  2. select *中的*符号扩展为表上的所有列。

5.2 优化器

经过预处理阶段后,还需要为 SQL 查询语句先制定一个执行计划,这个工作交由优化器来完成的。

优化器主要负责将 SQL 查询语句的执行方案确定下来,比如在表里面有多个索引的时候,优化器会基于查询成本的考虑,来决定选择使用哪个索引。

5.3 执行器

当选择了执行方案后,MySQL 就准备开始执行了,首先执行前会校验该用户有没有权限,如果没有权限,就会返回错误信息,如果有权限,就会去调用引擎的接口,返回接口执行的结果。

6.总结

执行一条 SQL 查询语句,期间发生了什么?

  • 连接器:建立连接,管理连接、校验用户身份;
  • 查询缓存:查询语句如果命中查询缓存则直接返回,否则继续往下执行。MySQL 8.0 已删除该模块;
  • 解析 SQL,通过解析器对 SQL 查询语句进行词法分析、语法分析,然后构建语法树,方便后续模块读取表名、字段、语句类型;
  • 执行 SQL:执行 SQL 共有三个阶段:
  • 预处理阶段:检查表或字段是否存在;将 select * 中的 * 符号扩展为表上的所有列。
  • 优化阶段:基于查询成本的考虑, 选择查询成本最小的执行计划;
  • 执行阶段:根据执行计划执行 SQL 查询语句,从存储引擎读取记录,返回给客户端;