跳到主要内容

逻辑架构

一、服务器处理客户端请求

客户端进程向服务器进程发送一段文本(SQL 语句),服务器进程处理后再向客户端进程发送一段文本(处理结果)。

  1. 连接管理,处理来自客户端的请求,用户名、密码、权限的校验。
  2. 解析与优化
  3. 存储引擎

Connectorsmysql 服务器之外的客户端程序。 Management Service & Utilities:基础服务组件。 Connection Pool:连接池,提供了多个用于客户端与服务器端交互的线程。 SQL InterfaceSQL 接口,接受 SQL 指令,返回查询结果。 Parser:解析器,语法解析,语义解析,生成语法树。 Optimizer :优化器,对 SQL 进行优化。 Caches & Buffers:查询缓存,以 key-value 方式缓存查询结果(MySQL8 中没有此模块)。 Pluggable Storage Engine:插件式的存储引擎,与底层的文件系统进行交互。 File System:文件系统。 File & Logs:日志文件。

二、执行过程

  1. Connectors
  2. Connection pool
  3. SQL Interface
  4. Cache & Buffers (MySQL5.7)
  5. Parser
  6. Optimizer
  7. Management Servce & Utilties
  8. File System
  9. Cache & Buffers
  10. SQL Interface

三、Connectors

客户端

四、连接层

Connection Pool

连接层的作用:负责认证、管理连接、获取权限信息。

客户端访问 MySQL 服务前,需要进行 TCP 连接(三次握手)。 对客户端通过 TCP 传过来的账号密码做身份认证,权限获取。

  1. 认证失败,返回 Access denied for user 错误,客户端程序结束。
  2. 认证成功,读取权限表,获取到当前账号拥有的权限,之后的权限判断逻辑,都将依赖此时读取到的权限

多个系统可以与 MySQL 服务器建立多个连接,为了复用 TCP 连接避免无限创建 TCP 连接与 TCP 频繁创建销毁带来的资源耗尽、性能下降问题),MySQL 服务器有专门的 TCP 连接池 限制连接数,采用 长连接模式 复用 TCP 连接

TCP 连接收到请求后,必须要分配一个线程专门与这个客户端交互。所以后面会有个线程池,去走后面的流程。每一个连接从线程池中获取线程,省去了创建和销毁线程的开销。

五、服务层

SQL Interface

  • 接受用户的 sql 命令,返回查询结果。
  • MySQL 支持 DML、DDL、存储过程、视图、触发器、自定义函数等多种 SQL 接口。

Parser

  • 在解析器中对 sql 语句进行语法分析语义分析。将 sql 语句分解成数据结构,并将这个结构传递到后续的步骤中,以后 sql 语句的传递和处理就是基于这个结构的。
  • 在 sql 命令传递到解析器的时候会被解析器验证和解析,并创建语法树,并根据数据字典丰富查询语法树,会验证该客户端是否具有执行该查询的权限。创建好语法树后,MySQL 还会对 sql 查询进行语法上的优化,进行查询重写。

Optimizer

  • sql 语句在语法解析之后、查询之前会使用查询优化器确定 sql 语句的执行路径,生成一个执行计划
  • 这个执行计划表明应该 使用哪些索引进行查询(全表检索还是使用索引检索),表之间的连接顺序如何,最后会按照执行计划中的步骤调用存储引擎提供的方法来真正的执行查询,并将查询结果返回给用户。
  • 使用 选取-投影-连接 策略进行查询 select id,name from student where gender = '女'; 这个 select 查询先根据 where 语句进行 选取,而不是将表全部查询出来以后再进行过滤。这个 select 查询先根据 id、name 进行属性 投影,而不是将属性全部取出来以后再进行过滤,将这两个查询条件 连接 起来生成最终查询结果。

Cache & Buffers

  • MySQL 内部维持一些 CacheBuffer
  • 缓存机制是由一系列小缓存组成的。比如表缓存,记录缓存,key 缓存,权限缓存等。
  • 这个查询缓存可以在不同客户端之间共享
  • MySQL 5.7.20 不推荐使用缓存,并在 MySQL 8.0 删除(原因:命中率极低)。

六、引擎层

Pluggable Storage Engines

插件式存储引擎架构将查询处理和其他的系统任务以及数据的存储提取相分离。

插件式存储引擎层,真正的负责了 MySQL 中数据的存储和提取,对物理服务器级别维护的底层数据执行操作,服务器通过 API存储引擎进行通信。

查看 MySQL 执行的存储引擎

show engines;

七、存储层

File System

  • NTFS
  • ufs
  • ext2/3
  • NFS
  • SAN
  • NAS

Files & Logs

  • Redo
  • Undo
  • Data
  • Index
  • Binary
  • Error
  • Query
  • Slow