外观
MySQL 的底层结构
⭐ 题目日期:
字节 - 2024/12/10
📝 题解:
MySQL 的底层结构是一个分层架构,从客户端请求到数据存储的整个流程涉及多个组件协作。以下是其核心组成部分的详细解析:
1. 整体架构分层
MySQL 可分为四层:
- 连接层:处理客户端连接、认证、权限管理。
- 服务层:负责 SQL 解析、优化、缓存、内置函数。
- 存储引擎层:负责数据的存储、索引、事务实现(如 InnoDB)。
- 存储层:数据最终存储在磁盘文件或内存中。
2. 核心组件详解
2.1 连接层
- 线程管理:通过线程池处理客户端连接(如 Java 的
Connector/J
)。 - 认证与权限:验证用户名/密码,检查操作权限。
- 协议支持:支持 TCP/IP、Socket、命名管道等连接方式。
2.2 服务层
- SQL 接口:接收 SQL 命令(如
SELECT
、INSERT
),返回结果。 - 解析器(Parser):
- 词法分析:拆分 SQL 为关键字、表名、字段等。
- 语法分析:生成抽象语法树(AST),检查语法错误。
- 优化器(Optimizer):
- 选择最优执行计划(如索引选择、JOIN 顺序)。
- 基于成本模型(CPU、I/O 开销)优化。
- 查询缓存(Query Cache)(注:MySQL 8.0 已移除):
- 缓存
SELECT
结果,以 Key-Value 形式存储(Key 是 SQL 语句哈希值)。
- 缓存
2.3 存储引擎层
- 插件式设计:支持 InnoDB、MyISAM、Memory 等引擎。
- 核心引擎 InnoDB:
- 缓冲池(Buffer Pool):缓存热数据页(默认大小
128MB
),减少磁盘 I/O。 - 事务支持:通过 Redo Log(重做日志)和 Undo Log(回滚日志)实现 ACID。
- 锁机制:行级锁、间隙锁(Gap Lock)、Next-Key Lock(解决幻读)。
- MVCC:多版本并发控制,通过隐藏的
DB_TRX_ID
和DB_ROLL_PTR
字段实现非阻塞读。
- 缓冲池(Buffer Pool):缓存热数据页(默认大小
2.4 存储层
- 物理文件结构:
- 表空间(Tablespace):
- 系统表空间(
ibdata1
):存储元数据、Undo Log。 - 独立表空间(
*.ibd
):每张表单独存储(默认启用)。
- 系统表空间(
- 段(Segment):数据段(B+树叶子节点)、索引段(非叶子节点)。
- 区(Extent):连续页的集合(1 区 = 64 个页,默认 1MB)。
- 页(Page):最小存储单元(默认
16KB
),存储行数据或索引。
- 表空间(Tablespace):
- 索引结构:
- B+树索引:所有数据按主键排序存储(聚簇索引)。
- 二级索引:叶子节点存储主键值,查询时需回表。
3. 关键日志系统
- Binlog(归档日志):
- 逻辑日志,记录所有写操作(用于主从复制、数据恢复)。
- 格式:
STATEMENT
(SQL 语句)、ROW
(行数据变更)、MIXED
。
- Redo Log(重做日志):
- 物理日志,记录数据页的修改(保证事务持久性)。
- 循环写入,通过
innodb_flush_log_at_trx_commit
控制刷盘策略。
- Undo Log(回滚日志):
- 存储事务前的数据旧版本,用于回滚和 MVCC。
4. 事务与锁机制
- 事务流程:
- 开启事务(
BEGIN
)。 - 生成 Undo Log。
- 修改数据,记录 Redo Log。
- 提交事务(Redo Log 刷盘)或回滚(通过 Undo Log 恢复)。
- 开启事务(
- 隔离级别:
READ UNCOMMITTED
→READ COMMITTED
→REPEATABLE READ
(默认) →SERIALIZABLE
。
- 锁竞争:
- 行锁通过索引实现,无索引时退化为表锁。
- 死锁检测:通过等待图(Wait-for Graph)检测并回滚代价小的事务。
5. 内存管理
- Buffer Pool:
- 缓存数据页,采用 LRU 算法淘汰冷数据。
- 通过
innodb_buffer_pool_size
配置大小(建议为物理内存的 70-80%)。
- Change Buffer:
- 缓存非唯一索引的变更(如
INSERT
、UPDATE
),减少随机 I/O。
- 缓存非唯一索引的变更(如
- Log Buffer:
- 缓存 Redo Log,定期刷盘(通过
innodb_log_buffer_size
配置)。
- 缓存 Redo Log,定期刷盘(通过
6. 物理文件示例
- 数据文件:
*.ibd
:InnoDB 表的数据和索引。*.frm
:表结构定义(MySQL 8.0 后移除,元数据存于数据字典)。
- 日志文件:
ib_logfile0/1
:Redo Log。mysql-bin.000001
:Binlog。
- 配置文件:
my.cnf
(Linux)或my.ini
(Windows)。
7. 总结
- 分层协作:客户端请求依次经过连接层→服务层→存储引擎层→磁盘。
- 性能关键:Buffer Pool 减少磁盘 I/O,B+树索引加速查询,Redo Log 保证事务持久性。
- 扩展性:插件式存储引擎设计,支持不同场景需求(如 InnoDB 适合 OLTP,MyISAM 适合读密集型场景)。
通过理解底层结构,可以更好地优化 SQL、设计索引、配置参数(如缓冲池大小),并解决锁竞争、死锁等问题。