MySQL(InnoDB 引擎)中的 页(Page)结构 与 Oracle 中的 块(Block)结构

目录标题

    • 一、共同点(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+TreeB-Tree/B+Tree
组成部分块头+槽数组+记录区块头+事务槽+行数据区
管理方式Buffer PoolBuffer 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 数据块
默认大小16KB8KB
可调粒度创建时设定,后续不可更改(全库统一)表空间级别粒度(每表空间可不同)
行结构包含事务信息、回滚指针、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 空间(非延迟清理)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值