目录标题
- 一、共同点(InnoDB 页 vs Oracle 块)
- 二、InnoDB 页结构详解(MySQL)
- ✅ 默认页大小:**16KB**(可通过 `innodb_page_size` 修改为 4K/8K/16K)
- 📦 InnoDB 页结构组成(16KB):
- 🧩 页类型(通过 Page Header 中 type 字段区分):
- 三、Oracle 块结构详解
- ✅ 默认块大小:**8KB**(可建库时指定为 2K、4K、8K、16K、32K)
- 📦 Oracle 数据块组成:
- 🔍 Oracle 特有结构:
- 四、关键对比表
- 五、示意图对比(简化)
- ✅ InnoDB 页结构(16K):
- ✅ Oracle 数据块结构(8K):
- 六、总结适用场景与优化建议
MySQL(InnoDB 引擎)中的 页(Page)结构 与 Oracle 中的 块(Block)结构 都是数据库物理存储管理的最小单位,两者在作用上类似,但在实现细节上存在明显差异。
一、共同点(InnoDB 页 vs Oracle 块)
维度 | MySQL(InnoDB 页) | Oracle(数据块) |
---|
最小IO单位 | ✅ 是 | ✅ 是 |
默认大小 | 16KB(可调) | 8KB(可调) |
用途 | 存储表数据、索引等 | 存储表、索引、UNDO等 |
存储结构 | 均使用 B+Tree | B-Tree/B+Tree |
组成部分 | 块头+槽数组+记录区 | 块头+事务槽+行数据区 |
管理方式 | Buffer Pool | Buffer Cache |
具备事务元信息 | ✅ 含MVCC信息 | ✅ 包含ITL槽、SCN等 |
二、InnoDB 页结构详解(MySQL)
✅ 默认页大小:16KB(可通过 innodb_page_size
修改为 4K/8K/16K)
📦 InnoDB 页结构组成(16KB):
[ Page Header (38 bytes) ] -- 页的元数据,如页号、类型、记录数
[ Infimum/Supremum Records ] -- 伪记录,用于定位最小/最大记录
[ User Records ] -- 实际用户行数据,按主键顺序排列
[ Free Space ] -- 空闲空间,用于插入新行
[ Page Directory ] -- 槽数组,存储行偏移量(类似索引)
[ File Trailer (8 bytes) ] -- 校验和、页标识
🧩 页类型(通过 Page Header 中 type 字段区分):
页类型 | 说明 |
---|
数据页 | 存储表记录 |
索引页 | 存储B+Tree索引记录 |
Undo页 | 存储undo日志(undo segment) |
Segment页 | 管理段描述符、空间信息 |
Insert Buffer页 | 插入缓冲(change buffer) |
三、Oracle 块结构详解
✅ 默认块大小:8KB(可建库时指定为 2K、4K、8K、16K、32K)
📦 Oracle 数据块组成:
[ Block Header ] -- 块元信息,如块号、类型、SCN、事务槽等
[ Table Directory ] -- 当前块中包含哪些表(CLUSTER时可能多个)
[ Row Directory ] -- 行偏移数组(类似InnoDB的slot array)
[ Free Space ] -- 空闲区,用于新插入
[ Row Data ] -- 实际行数据,从块底部往上增长
🔍 Oracle 特有结构:
结构 | 说明 |
---|
ITL槽(Interested Transaction List) | 每个事务在块中申请一个槽,用于行锁标识 |
SCN(系统变更号) | 每个块记录最后修改时间戳,保证一致性 |
ROW FLAG | 标识行是否有效、是否被删除等状态信息 |
四、关键对比表
特性 | InnoDB Page (MySQL) | Oracle 数据块 |
---|
默认大小 | 16KB | 8KB |
可调粒度 | 创建时设定,后续不可更改(全库统一) | 表空间级别粒度(每表空间可不同) |
行结构 | 包含事务信息、回滚指针、MVCC信息 | 含行头、ITL槽、SCN |
块头信息 | 简单页头,页号/类型/记录指针 | 包含块号、事务槽、SCN等更多元信息 |
页内目录 | Slot数组(从上往下记录每行的偏移) | Row Directory |
块级事务支持 | 通过 undo log + trx_id + roll_pointer 实现 | 通过事务槽(ITL)与 undo segment 实现 |
多版本并发控制 MVCC | ✅(行级版本,事务隔离) | ✅(UNDO + SCN控制版本) |
删除记录处理 | 标记为已删除,实际行保留(需purge) | 行头标识+事务槽决定可见性 |
五、示意图对比(简化)
✅ InnoDB 页结构(16K):
+------------------------+
| Page Header |
+------------------------+
| Infimum/Supremum |
+------------------------+
| Row 1 |
| Row 2 |
| ... |
+------------------------+
| Page Directory (slot) |
+------------------------+
| File Trailer |
+------------------------+
✅ Oracle 数据块结构(8K):
+------------------------+
| Block Header |
+------------------------+
| ITL (事务槽) |
+------------------------+
| Table Directory |
+------------------------+
| Row Directory |
+------------------------+
| Free Space |
+------------------------+
| Row Data |
+------------------------+
六、总结适用场景与优化建议
目的 / 场景 | InnoDB 页设计优势 | Oracle 块设计优势 |
---|
高并发写入场景 | Change Buffer + B+Tree 插入优化 | 多ITL槽并发写 + 延迟块清理机制 |
MVCC一致性 | 行版本(undo log + trx_id) | SCN + undo segment 精确版本控制 |
页压缩 / 大字段优化 | 支持 COMPRESSED /DYNAMIC 格式 | 支持 LOB 存储在独立块 + 分片存储机制 |
数据页清理(Purge)机制 | purge线程异步清理 | commit后即回收 undo 空间(非延迟清理) |