|---------|-------------------------------|
| 层级 | 说明 |
| 表空间 | 最高层,对应 ibd 文件,含记录和索引 |
| 段 | 数据段(叶子节点)、索引段(非叶子节点)、回滚段 |
| 区 | 1MB = 64 个连续页(默认页 16KB),保证连续性 |
| 页 | 磁盘管理最小单元,默认 16KB |
| 行 | 数据按行存放,含隐藏字段 |
5. InnoDB 内存架构
5.1 Buffer Pool(缓冲池)
缓存磁盘数据的核心内存区域。增删改查先操作缓冲池,按特定频率刷盘。
Page 三种状态:
- free page:空闲
- clean page:已使用,未修改
- dirty page(脏页):已修改,未刷盘
LRU 优化 :链表分 Young 区(5/8)和 Old 区(3/8)。新数据先放 Old 区头部,停留超过 innodb_old_blocks_time 才能进 Young 区,防止全表扫描污染热点数据。
5.2 Change Buffer(插入缓冲)
针对二级索引的更新缓存。DML 时数据不在 Buffer Pool,变更先存 Change Buffer,后续读取时合并。减少随机 I/O。
5.3 Adaptive Hash Index(自适应哈希索引)
系统自动为热点索引页 构建 Hash 索引,加速等值查询,无需人工干预。参数:adaptive_hash_index。
5.4 Log Buffer(日志缓冲区)
保存待写入磁盘的 redo log,默认 16MB。
|----------------------------------|-------------------------------------|
| 参数 | 说明 |
| innodb_log_buffer_size | 日志缓冲区大小 |
| innodb_flush_log_at_trx_commit | 0=每秒刷、1=每次提交刷(默认)、2=每次提交写 OS 缓存+每秒刷 |
6. InnoDB 磁盘架构
|--------------------------------|-------------------------------------------|
| 结构 | 说明 |
| 系统表空间 | Change Buffer 存储区 |
| File-Per-Table | 默认每表独立 ibd 文件(innodb_file_per_table=ON) |
| 通用表空间 | CREATE TABLESPACE 创建 |
| Undo 表空间 | 初始两个,各 16MB,存 undo log |
| 临时表空间 | 会话级和全局级 |
| 双写缓冲区 (Doublewrite Buffer) | 刷盘前先写,防止部分写导致数据页损坏 |
| Redo Log | 事务持久性的保证 |
7. 后台线程
|-------------------------|--------------------------------------------------------|
| 线程 | 职责 |
| Master Thread | 核心线程:异步刷脏页、合并 Change Buffer、回收 undo 页 |
| IO Thread | 处理 AIO(异步 IO)回调(read/write/insert buffer/log IO 各 4 个) |
| Purge Thread | 回收已提交事务的 undo log(MVCC 不再需要时) |
| Page Cleaner Thread | 协助刷脏页,减轻 Master 压力 |
8. InnoDB 三大特性
- 插入缓冲(Change Buffer):减少随机 I/O
- 两次写(Doublewrite):防止部分写失败导致数据损坏
- 自适应哈希索引(AHI):自动优化热点查询