MemTable:每个分区一份,存放分区内存增量数据(动态数据),双索引:BTree + HashTable。
图里蓝色方块 = MVCC Row(行版本节点),BTree、HashTable 里面只存指针,不存真实数据,真实行数据存在内存堆上,索引指向它。
1. 上方:BTree(B + 树)
- root node:根节点;leaf node:叶子节点。
- 括号里
(1,p)、(6,p):1、6是主键值;p是指针,指向下方蓝色row节点 (MVCCRow)。 -
BTree 用途:范围扫描、order by、范围查询,主键有序排列。
BTree 叶子节点按主键排序,遍历叶子节点就可以做全表 / 范围扫描。
2. 右上角:Hash Table
- Hash 表同样只存指针,根据主键 hash,做等值点查询(where id=?),O (1) 查找速度。
同一行主键,BTree 叶子 和 HashTable 都指向同一个 row 头节点,两个索引互相配合。
- 点查优先走 HashTable;范围扫描走 BTree。两个索引自动维护一致性。
3. 中间蓝色 row 方块 + insert/update/delete 方块(MVCC 多版本链表)
每个主键对应一条版本双向链表:
- 蓝色
row:链表头结点(MVCCRow 头),BTree/HashTable 指针指向这个头。 - 绿色
insert/update/delete:每一次 DML 操作生成一个新版本节点,串联成链表。
同一行多次修改,不会原地覆盖旧数据,而是追加新版本挂在链表上。delete 也只是生成一个 delete 标记版本,不会直接删除旧记录;多版本全部保留,靠 MVCC 做快照可见性判断。
举例子:一行做 insert → update → update,内存生成 3 个版本,串成链表,读的时候根据快照时间挑选对当前会话可见的版本。
4. 绿色箭头是什么?
绿色箭头 = 事务回调指针链路,指向底层事务管理器 OB TransCallbackMgr。OB TransCallbackMgr:OceanBase 事务回调管理器,管理事务的unlock callback解锁回调、commit callback提交回调。
- 每个未提交事务 T1产生的行版本,绿色箭头把行版本挂到事务回调管理器上。
- 事务提交 commit callback:事务提交成功之后,修改版本的可见性,这些版本对其他事务可见。
- unlock callback 解锁回调:事务结束,释放行锁。
关键点:只要事务还没提交,它生成的所有新版本,都通过绿色箭头挂靠在这个事务回调管理器;
- 如果事务提交:执行
commit callback,版本变为全局可见;- 如果事务回滚:回调处理,这些版本直接作废,其他会话看不到。
回答你的疑问:
- BTree、HashTable 存的确实全是指针;真实行数据内容存放在内存堆内存,不在索引树里面,索引只存地址指向数据块。
- 绿色箭头 = 行版本关联到所属事务的回调链路,用来处理事务提交 / 回滚、解锁,是事务和 MVCC 行版本之间的关联纽带。
1 个赞
