oceanbase update的问题

【 使用环境 】测试环境
【 OB or 其他组件 】
【 使用版本 】4.x
【问题描述】在学习ob中遇到的疑问,百思不得其解:一条数据(100,‘张三’,18)对应三个字段(id,name,age);在ob中执行update table set age=20 where id=100。。更新后的这一条新数据是分开存放在不同地方(id,age和id,name存储在不同位置),还是存储在一起(id,name,age)
【复现路径】
【附件及日志】无

1 个赞

一行数据 肯定是存放在一起的 不同的分区数据 和你的架构有关系 架构不同存放的位置也是不同的

2 个赞

oceanbase 底层使用的的是LSM-Tree,在LSM-Tree中,一行数据通常是以键值对(key-value pair,简称KV)的形式进行存储的,Key 通常用于唯一标识一条数据记录,而 Value 则存储了该数据记录的具体内容。一整行数据是存储在一起的

2 个赞

OceanBase 数据库的内存存储引擎 MemTable 由 BTree 和 Hashtable 组成,在插入/更新/删除数据时,数据被写入内存块,在 HashTable 和 BTree 中存储的均为指向对应数据的指针。

简单理解:对一行(key主键唯一定位一行)更新操作,先是写WAL日志(故障时通过该日志来恢复)持久化,然后利用该租户的memstore中通过 HashTable 和 BTree 来找到该key对应的row如下图的绿色部分,所有的修改操作都是MvccNode,在该row中多个MvccNode组成一个链表,当然内部机制在某些情况会对多个MvccNode进行合并。

读取数据的时候考虑事务版本号,同时也会将各次修改的字段做一个fuse合并,逻辑上看就是一行完整的数据。如你上面说的表有(a,b,c)三列,一开始是(1,2,3)假设a是主键,第一次改了b的值为5那么row里面会有MvccNode记录该操作,(1,5,),第二次又将c的值修改6,类似有(1,6),最终该行的数据就是几个操作合并起来(1,5,6)。

所以你问题的问题数据应该是存放一行数据在内存,是存放在一个row节点(一行),row节点又记录了多次变更的操作形成多个MvccNode的链表。上面只是一个大概逻辑例子,辅助理解。更详细的细节得去读源码,以具体的版本为准。

参考这个文档https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000218991

2 个赞

感谢。很详细。