MySQL 的基本架构

2025/06/03

Categories: 技术 Tags: MySQL

⚠️️ 整理自互联网,用于概念了解。

MySQL 的架构采用经典的『客户端/服务器模型』和『分层设计』,核心组件协同工作以处理查询、管理数据、保证事务和提供高可用性等。其核心架构通常分为以下几个主要层次和组件,详见官方文档

连接层

Connectors

连接器 Connectors 是 MySQL 官方提供的驱动程序,用于让不同编程语言编写的应用程序(客户端)能够与 MySQL 服务器通信。它实现了 MySQL 的通信协议,封装了底层连接细节,使开发者无需处理网络传输、数据封包等复杂操作。严格来说连接器是客户端的组件,而非服务端。

服务层

SQL Interface

是 MySQL 服务层的核心组件之一,负责接收客户端发送的 SQL 命令,并将执行结果返回给客户端。是连接客户端请求与数据库内部处理的桥梁。

主要的核心功能有:

  1. 接收 SQL 命令:客户端通过连接器发送的 SQL 语句首先到达 SQL 接口。支持多种交互协议。
  2. 分发 SQL 到内部组件:将 SQL 语句交给解析器进行语法和语义分析,生成解析树。解析后的指令交给优化器生成最优执行计划。
  3. 处理执行结果:接收存储引擎返回的数据(如查询结果集),将结果转换为客户端兼容的格式(如二进制流、表格形式)。通过连接层将结果返回给客户端。

Parser

解析 SQL 语句,检查语法正确性,分解 SQL 为可执行的逻辑单元。

Optimizer

优化 SQL 查询,生成高效的执行计划。基于索引、表统计信息选择最佳执行路径(如选择 JOIN 顺序、索引使用)。

Executor

根据优化器生成的执行计划,调用存储引擎提供的接口来执行操作。如果启用了查询缓存(在 MySQL 5.7 及更早版本中),会先检查查询缓存。

Caches

作用:缓存查询结果以提高性能。功能:命中相同查询直接返回结果(8.0 已移除,推荐外部缓存如 Redis)。

存储引擎层

负责数据的物理存储、检索和管理。MySQL 的核心优势之一是其可插拔的存储引擎架构。存储引擎是表级别的,同一个数据库的不同表可以使用不同的存储引擎。存储引擎通过定义良好的 API 与服务层交互,这些 API 屏蔽了不同引擎实现的差异。

常见引擎:

InnoDB

MySQL 的默认引擎

关键结构:Buffer Pool (内存缓冲池), Redo Log (重做日志), Undo Log (回滚日志), Doublewrite Buffer (双写缓冲区)。

MyISAM

MySQL 5.5 之前的默认引擎

适用场景:只读或读远大于写的简单应用(现在一般推荐使用 InnoDB 或专用引擎)。

Memory

将所有数据存储在内存中,速度极快。表结构在服务器重启后保留,但数据会丢失。使用哈希索引(默认)或 B-Tree 索引。适用于临时表、缓存、会话存储等需要超快访问但可容忍数据丢失的场景。

Archive

专为存储和检索大量很少被引用的历史、归档或审计信息而设计。支持 INSERT 和 SELECT,但不支持 UPDATE, DELETE (通常通过行删除实现,非标准 SQL),不支持索引。数据压缩率非常高。

CSV

将数据以逗号分隔值格式存储在文本文件 (.CSV) 中。可以直接用文本编辑器查看。不支持索引。常用于数据交换。

物理文件层

存储引擎最终将数据、索引、日志等持久化到磁盘上的文件系统。

关键文件类型 (以 InnoDB 为例):

Tablespace Files

每个 InnoDB 表通常对应一个 .ibd 文件 (当 innodb_file_per_table=ON 时),存储表的数据和索引。

系统表空间 (ibdata1):存储数据字典、Undo Log、Doublewrite Buffer 等元数据(取决于配置)。

Redo Log Files

记录所有对数据页的物理修改(事务日志)。用于崩溃恢复和保证事务的持久性 (Durability)。循环写入。

Binary Log Files

由服务层生成,独立于存储引擎。记录所有修改数据的 SQL 语句(或行更改事件)。用于主从复制 (Replication) 和数据恢复 (Point-in-Time Recovery)。

Error Log

记录服务器启动、运行、停止过程中的错误、警告信息。

Slow Query Log

记录执行时间超过阈值的 SQL 语句。

General Query Log

记录所有客户端连接和执行的语句(性能开销大,通常关闭)。

Relay Log

从 Master 接收到的 Binlog 事件临时存储位置。

相关问题

MySQL 连接池是在连接器还是SQL接口层实现?

MySQL 的连接池(Connection Pool)在连接器(Connectors)层实现,而非 SQL Interface 层。这是由 MySQL 的分层架构和各层职责决定的。

二者通过 TCP 连接 通信,各司其职。

参考资料