memtable组织架构不懂


这张图咋个理解,没太懂。都是指针的话,数据存放在什么位置,绿色是代表什么?

MemTable:每个分区一份,存放分区内存增量数据(动态数据),双索引:BTree + HashTable
图里蓝色方块 = MVCC Row(行版本节点),BTree、HashTable 里面只存指针,不存真实数据,真实行数据存在内存堆上,索引指向它。

1. 上方:BTree(B + 树)

  • root node:根节点;leaf node:叶子节点。
  • 括号里(1,p)(6,p)1、6是主键值;p指针,指向下方蓝色row节点 (MVCCRow)。
  • :white_check_mark: 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 TransCallbackMgrOB TransCallbackMgr:OceanBase 事务回调管理器,管理事务的unlock callback解锁回调、commit callback提交回调。

  • 每个未提交事务 T1产生的行版本,绿色箭头把行版本挂到事务回调管理器上。
  • 事务提交 commit callback:事务提交成功之后,修改版本的可见性,这些版本对其他事务可见。
  • unlock callback 解锁回调:事务结束,释放行锁。

:sparkles:关键点:只要事务还没提交,它生成的所有新版本,都通过绿色箭头挂靠在这个事务回调管理器;

  • 如果事务提交:执行commit callback,版本变为全局可见;
  • 如果事务回滚:回调处理,这些版本直接作废,其他会话看不到。

:point_right: 回答你的疑问:

  1. BTree、HashTable 存的确实全是指针;真实行数据内容存放在内存堆内存,不在索引树里面,索引只存地址指向数据块。
  2. 绿色箭头 = 行版本关联到所属事务的回调链路,用来处理事务提交 / 回滚、解锁,是事务和 MVCC 行版本之间的关联纽带。
1 个赞