一、InnoDB 逻辑存储结构(层级:大→小)
表空间 → 段 → 区 → 页 → 行
1. 表空间
对应磁盘 .ibd 文件,是 InnoDB 最高存储单元。一个 MySQL 可存在多个表空间,存储表数据、索引、回滚数据等。
2. 段
表空间内的逻辑单元,分为三种:
- 数据段:存储业务数据
- 索引段:存储索引数据
- 回滚段:存储 undo log 回滚日志
3. 区
表空间的基础连续单元
- 大小:1MB
- 包含:64 个连续数据页
- 机制:每次批量申请 4-5 个区,保证数据连续性、优化 IO
4. 页
InnoDB 磁盘最小管理单元
- 默认大小:16KB
- 所有读写均以页为单位
5. 行
InnoDB 最小数据存储粒度,数据按行存放。
二、InnoDB 整体架构
分为:内存结构、磁盘结构、后台线程
(一)内存结构
1. Buffer Pool 缓冲池
- 核心缓存组件,缓存热点数据页
- 增删改查优先操作内存,异步刷磁盘,大幅减少磁盘 IO
- 以 Page 为单位、链表结构管理
2. Change Buffer 更改缓冲区
- 只针对二级索引DML 操作
- 数据页不在缓冲池时,变更先暂存此处,后续访问再合并刷盘
- 解决二级索引随机 IO 问题,提升性能
3. 自适应哈希索引(AHI)
- InnoDB 自动监控索引查询,可自主建立哈希索引
- 优化热点页等值查询,无需人工维护
4. Log Buffer 日志缓冲区
- 缓存 redo 日志,默认 16MB
- 三种刷盘策略:
- 0:每秒刷盘(性能高、不安全)
- 1:每次事务提交强制刷盘(最安全、慢)
- 2:提交写内存、每秒刷盘(折中)
(二)磁盘结构
- 通用表空间:手动创建,可指定表使用
- 撤销表空间:实例初始化自动创建,存 undo 日志
- 临时表空间:存储临时表数据,会话结束自动清理
- 双写缓冲区:数据页落盘前先备份,解决页断裂、异常恢复
- Redo Log 重做日志:保障事务持久性,宕机重启可恢复数据
(三)后台线程
- Master Thread:主线程,刷脏页、合并缓存、回收 undo 页
- IO Thread:处理异步 IO 请求回调,提升并发 IO 性能
- Purge Thread:回收已提交事务的 undo 日志
- Page Cleaner Thread:协助刷脏页,减轻主线程压力
三、事务原理 & ACID
1. 事务四大特性 ACID
- 原子性:要么全成功、要么全回滚
- 一致性:事务前后数据合法一致
- 隔离性:并发事务互相隔离
- 持久性:提交后数据永久生效
2. 底层实现分工
- 原子性 ➜ undo log
- 持久性 ➜ redo log
- 一致性 ➜ redo log + undo log
- 隔离性 ➜ 锁 + MVCC
3. 核心日志
redo log(重做日志)
- 记录数据页物理修改
- 遵循 WAL 预写日志:先写日志、后写数据
- 作用:崩溃恢复、保证持久性
undo log(回滚日志)
- 记录数据修改前的快照
- 作用:事务回滚、提供 MVCC 历史版本
- 特点:insert undo 可立即删除;update/delete undo 需要保留用于快照读
四、MVCC 多版本并发控制
1. 核心作用
实现无锁快照读,解决读写冲突,提升并发,用于 RC、RR 隔离级别
2. 两种读
- 当前读:读最新数据、加锁、阻塞(update/delete/select ... for update)
- 快照读:普通 select、不加锁、非阻塞、读历史版本
3. MVCC 三大核心组件
隐藏字段 + undo 版本链 + ReadView
(1)行隐藏字段
- DB_TRX_ID:最后修改该行的事务 ID
- DB_ROLL_PTR:回滚指针,指向旧版本数据
- DB_ROW_ID:无主键时的隐藏主键
(2)undo log 版本链
多次修改同一行,会通过回滚指针串联形成数据版本链表,保存所有历史快照版本。
(3)ReadView 读视图
快照读的判断依据,存储当前活跃事务信息,核心 4 字段:
- m_ids:当前活跃事务 ID 集合
- min_trx_id:最小活跃事务 ID
- max_trx_id:最大活跃事务 ID+1
- creator_trx_id:当前读视图所属事务 ID
4. 隔离级别差异
- RC 读已提交 :每次快照读都会重新生成 ReadView,可读到已提交数据
- RR 可重复读 :事务第一次快照读生成 ReadView,后续复用,保证可重复读
5. 可见性规则
通过版本链中每条记录的 trx_id 与 ReadView 比对,判断版本是否可见,最终实现多版本并发控制。
核心总结
- 存储层级:表空间→段→区→页→行
- 架构:内存(缓冲池、更改缓冲、日志缓冲等)+ 磁盘文件 + 后台线程
- 事务:undo 保证原子性、redo 保证持久性、锁 + MVCC 保证隔离性
- MVCC 依赖:隐藏字段 + 版本链 + ReadView,实现无锁快照读