从一条查询 SQL 的执行过程描述 MySQL 的架构。
架构总览
不同的架构引擎共用一个 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。