逻辑架构
一、服务器处理客户端请求
客户端进程向服务器进程发送一段文本(SQL 语句
),服务器进程处理后再向客户端进程发送一段文本(处理结果)。
- 连接管理,处理来自客户端的请求,用户名、密码、权限的校验。
- 解析与优化
- 存储引擎
Connectors
:mysql
服务器之外的客户端程序。
Management Service & Utilities
:基础服务组件。
Connection Pool
:连接池,提供了多个用于客户端与服务器端交互的线程。
SQL Interface
:SQL
接口,接受 SQL
指令,返回查询结果。
Parser
:解析器,语法解析,语义解析,生成语法树。
Optimizer
:优化器,对 SQL
进行优化。
Caches & Buffers
:查询缓存,以 key-value
方式缓存查询结果(MySQL8
中没有此模块)。
Pluggable Storage Engine
:插件式的存储引擎,与底层的文件系统进行交互。
File System
:文件系统。
File & Logs
:日志文件。
二、执行过程
- Connectors
- Connection pool
- SQL Interface
- Cache & Buffers (MySQL5.7)
- Parser
- Optimizer
- Management Servce & Utilties
- File System
- Cache & Buffers
- SQL Interface
三、Connectors
客户端
四、连接层
Connection Pool
连接层的作用:负责认证、管理连接、获取权限信息。
客户端访问 MySQL
服务前,需要进行 TCP 连接
(三次握手)。
对客户端通过 TCP
传过来的账号密码做身份认证,权限获取。
- 认证失败,返回
Access denied for user
错误,客户端程序结束。 - 认证成功,读取权限表,获取到当前账号拥有的权限,
之后的权限判断逻辑,都将依赖此时读取到的权限
。
多个系统可以与 MySQL
服务器建立多个连接,为了复用 TCP 连接
(避免无限创建 TCP 连接与 TCP 频繁创建销毁带来的资源耗尽、性能下降问题),MySQL 服务器有专门的 TCP 连接池
限制连接数,采用 长连接模式
复用 TCP 连接
。
TCP 连接收到请求后,必须要分配一个线程专门与这个客户端交互。所以后面会有个线程池,去走后面的流程。每一个连接从线程池中获取线程,省去了创建和销毁线程的开销。
五、服务层
SQL Interface
- 接受用户的 sql 命令,返回查询结果。
- MySQL 支持 DML、DDL、存储过程、视图、触发器、自定义函数等多种 SQL 接口。
Parser
- 在解析器中对 sql 语句进行
语法分析
、语义分析
。将 sql 语句分解成数据结构,并将这个结构传递到后续的步骤中,以后 sql 语句的传递和处理就是基于这个结构的。 - 在 sql 命令传递到解析器的时候会被解析器验证和解析,
并创建语法树
,并根据数据字典丰富查询语法树,会验证该客户端是否具有执行该查询的权限。创建好语法树后,MySQL 还会对 sql 查询进行语法上的优化,进行查询重写。