深入浅出 MySQL InnoDB 存储结构:Buffer Pool、写缓冲与日志机制全解
InnoDB存储结构
InnoDB 是 MySQL 默认存储引擎,自 5.5 版本起广泛应用于事务型系统。其架构分为内存结构和磁盘结构两大部分。
内存结构
内存结构主要包括 Buffer Pool、Change Buffer、Adaptive Hash Index 和 Log Buffer 四大组件。
Buffer Pool(缓冲池)
基本概念: 缓冲池(Buffer Pool,简称BP)是InnoDB存储引擎的核心内存区域,主要用于缓存表数据和索引数据。
存储单元: Page(页)是BP的基本管理单位,默认大小16KB。
数据结构: 采用改进的链表结构管理:
- Free List:维护所有空闲页
- LRU List:管理已使用的页,采用改进的LRU算法
- Flush List:记录被修改过的脏页
关键配置参数:
innodb_buffer_pool_size:总大小(建议设为物理内存的50-70%)innodb_buffer_pool_instances:实例数
Change Buffer(写缓冲区)
概念: 写缓冲区是InnoDB存储引擎中一种优化非唯一普通索引更新的重要机制。
核心特性:
- Change Buffer占用Buffer Pool的空间,默认配置为25%
- 适用于非唯一普通索引页
合并触发时机:
- 主动读取
- 后台线程定期合并
- 空间不足
Adaptive Hash Index(自适应哈希索引)
自适应哈希索引用于优化对BP数据的查询,InnoDB存储引擎会在监控对表索引的查找,如果观察到建立哈希索引可以带来速度的提升,则建立哈希索引。
Log Buffer(日志缓冲区)
日志缓冲区主要用于临时存储即将写入磁盘日志文件的数据。
主要功能:
- 数据缓冲:所有DML操作产生的Redo和Undo日志都会先写入Log Buffer
- 自动刷新机制
- 手动刷新控制
innodb_flush_log_at_trx_commit 参数:
| 设置值 | 描述 | 风险 | 性能 |
|---|---|---|---|
| 0 | 每秒批量写入 | 最多丢失最近1秒 | 最高 |
| 1(默认) | 每次事务提交 | 无数据丢失 | 最低 |
| 2 | 写入OS Cache | 进程崩溃无丢 | 中等 |