MySQL: Architecture

29th August 2020 at 11:11am

从一条查询 SQL 的执行过程描述 MySQL 的架构。

架构总览

客户端 连接器 缓存层 分析器 优化器 执行器 Server 层 存储
 引擎 存储
 引擎 存储
 引擎 存储引擎层 管理连接,权限验证 词法分析,语法分析 执行计划生成,索引选择 操作引擎,返回结果

不同的架构引擎共用一个 Server 层

缓存层在 MySQL 8.0 之后因缺乏实用性被彻底删除,这里不再做讨论。

一个查询 SQL 的例子

连接器 负责跟客户端建立连接、获取权限、维持和管理连接:

  • 用户名密码的校验(authentication)
  • 权限判定(authorization),比如该用户所能查询的库表,会在这层获取
  • 维护长连接

无论使用的是 mysql 命令还是 MySQL client library 去连接 MySQL server,都是连接器做处理。

连接上 server 后,客户端可以发起一个查询请求:

select * from t1 join t2 using(ID) where t1.c=10 and t2.d=20;

分析器 做词法分析,理解这是一条查询语句,查询的是什么表、用什么条件。分析器会获得相应的库表结构,如果用户查询的表或列不存在(比如 t1 库不存在),会给出报错。但这层不考虑权限(比如用户是否有查询这个表的权限,我也不知道为啥)。

优化器 是在表里面有多个索引的时候,决定使用哪个索引;或者在一个语句有多表关联(join)的时候,决定各个表的连接顺序。比如上面的 SQL,即可以先按 t2.d 筛选也可以先按 t1.c 筛选。优化器会选效率更高的方式。

执行器 实际调用存储引擎接口,获取数据并返回给客户端。它也做权限控制。

主流的 存储引擎 是 InnoDB,一些场景下也用 Memory。