InnoDB 引擎 | 缓冲池 → 内存 → 磁盘 全链路解析
| 概念 | 大小 | 说明 |
|---|---|---|
| Page(页) | 16KB |
磁盘读写的最小单位 |
| Row(行) | ~2KB |
一行数据,最大65535字节 |
| Extent(区) | 1MB |
64个连续页组成 |
| Segment(段) | 可变 | 索引/数据段的逻辑单位 |
| Tablespace | 可变 | 表空间,包含多个段 |
每个数据页固定 16KB,包含以下区域:
逻辑存储容器,可以是系统表空间、独立表空间、或通用表空间
B+树的每个层级创建一个段(叶节点段 + 非叶节点段)
64个连续的 16KB Page = 1MB 空间,预分配减少碎片
最小I/O单位,16KB,包含页头、用户记录、页尾等
默认大小 128MB(可配置),以 16KB Page 为单位管理
Buffer Pool 使用改进的 LRU(最近最少使用)算法
对二级索引的修改先缓存在内存中,减少随机IO
UPDATE users SET name='新名字' WHERE age=25
age 索引页不在内存中,直接修改会很慢(随机IO)
将修改记录写入内存中的 Change Buffer
当索引页被读入时,合并 Change Buffer 的修改
主键索引(聚簇索引)的 B+树 结构,叶节点包含完整数据
| 对比项 | 聚簇索引(主键索引) | 二次索引(辅助索引) |
|---|---|---|
| 存储内容 | 完整的行数据 | 索引列 + 主键值 |
| 叶节点 | 直接是数据行 | 指向主键的指针 |
| 查找过程 | 一次定位 | 二次查找(回表) |
| 创建数量 | 每表一个 | 每列一个(可多个) |
所有叶子节点深度相同,查找复杂度 O(log n)
叶节点通过双向链表连接,支持范围查询
节点大小≈页大小(16KB),充分利用预读
Parser 解析 SQL,Optimizer 选择执行计划
在缓冲池中查找数据页是否已缓存
缓存命中,直接从内存读取,O(1) 复杂度
通过 B+树 定位数据页,触发磁盘 I/O
磁盘读取后放入缓冲池,返回数据
开启事务,获取事务ID
通过 B+树 找到应插入的数据页位置
将数据写入缓冲池中的数据页(标记为 dirty)
写入 Undo 日志,用于回滚
写入 Redo Log(可选),释放锁
Master Thread 定期将 dirty page 刷到磁盘