外观
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、设计索引、配置参数(如缓冲池大小),并解决锁竞争、死锁等问题。
