MySQL 架构

MySQL 主要分为 Server 层和存储引擎层:

  • Server 层:主要包括连接器、查询缓存、分析器、优化器、执行器等,所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图,函数等,还有一个通用的日志模块 binlog 日志模块。
  • 存储引擎:主要负责数据的存储和读取,采用可以替换的插件式架构,支持 InnoDB、MyISAM、Memory 等多个存储引擎,其中 InnoDB 引擎有自有的日志模块 redolog 模块。现在最常用的存储引擎是 InnoDB

MySQL Server 层基本组件

  1. 连接器

连接器负责身份认证和权限等相关功能。负责用户登录数据库,进行用户的身份认证,包括校验账户密码,权限等操作。

如果用户账户密码已通过,连接器会到权限表中查询该用户的所有权限,之后在这个连接里的权限逻辑判断都是会依赖此时读取到的权限数据,也就是说,后续只要这个连接不断开,即使管理员修改了该用户的权限,该用户也是不受影响的。

  1. 缓存(8.0 版本之后移除)

缓存负责缓存所执行的 SELECT 语句及该语句的结果集。

连接建立后,执行查询语句的时候,会先查询缓存,MySQL 会先校验这个 SQL 是否执行过,以 Key-Value 的形式缓存在内存中,Key 是查询语句,Value 是结果集。如果缓存 key 被命中,就会直接返回给客户端,如果没有命中,就会执行后续的操作,完成后也会把结果缓存起来,方便下一次调用。当然在真正执行缓存查询的时候还是会校验用户的权限,是否有该表的查询条件。

MySQL 查询不建议使用缓存,因为查询缓存失效在实际业务场景中可能会非常频繁,假如你对一个表更新的话,这个表上的所有的查询缓存都会被清空。对于不经常更新的数据来说,使用缓存还是可以的。

  1. 分析器

当 MySQL 语句没有命中缓存,那么就会进入分析器,进行词法分析与语法分析。

词法分析: 关键字提取

语法分析: 判断 SQL 语句是否符合语法规则

  1. 优化器

优化器以优化器角度的最优方案执行 SQL 语句。

例如:多个索引的时候该如何选择索引,多表查询的时候如何选择关联顺序等。

  1. 执行器

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

SQL 语句执行过程

查询语句

  1. 检查语句是否满足权限,不满足则返回错误信息,满足权限则执行下一步。(8.0 版本之前,会查询缓存)
  2. 通过分析器分析,进行词法分析与语法分析
  3. 优化器确定执行方案
  4. 校验权限,满足权限则调用数据库引擎接口,返回引擎执行结果

更新语句(增删改)

更新语句执行也会按照查询语句流程执行,在查询后,执行更新时要记录日志,分别有 MySQL 自带的 binlog(归档日志),此日志所有引擎可使用, InnoDB 引擎还自带了一个日志模块 redo log(重做日志),流程如下:

  1. 查询数据
  2. 修改查询到的数据
  3. 调用引擎 API 接口,写入数据
  4. 记录 redo log,并设置为 prepare 状态,通知执行器
  5. 执行器记录 binlog,通知引擎
  6. 引擎将 redo log 修改为 commit 状态

为什么是这个流程?

当 MySQL 出现异常时,判断 redo log 是否完整,如果判断是完整的,就立即提交。如果 redo log 只是预提交但不是 commit 状态,这个时候就会去判断 binlog 是否完整,如果完整就提交 redo log, 不完整就回滚事务。