对于tikv的rocksdb原理存在点疑问

关于学习TIDB302课程中,对于tikv的rocksdb有点疑问
比如下面的这个图
数据在写入的时候会写到memtable中,然后写入到sst文件,而且sst文件说是顺序写入的,但是假设A表和B表都在一个Memtable中,然后写入到一个sst文件,不能代表和两条数据就是按顺序排列的呀,表ID和主键ID构成key,也是表ID也是不一样的,有可能顺序就是乱的。
还是说在memable里准备写入到sst文件时,会分别写入到每个表的sst文件,如果写入到sst文件是按照表区分的,那SST里确实是按顺序排列的。

2 个赞

没有,Level 0 的 SST 就是和 memtable 是一样的,一个快照,基本上也是无序的
不过在进入 Level 0 的 SST 之前,memtable 会先把数据 写入 Immutable Memtable,在通过 Immutable Memtable flush 到 level 0 的 SST
从 Level 0 --> Level 1 ,会演变成有序,接着到更深的层次也是有序的
SST 因为对同一个 key,会有多个版本的数据值,对读取也就没那么友好了

1 个赞

Level 0 的 SST 和 memtable 是一样一样的;
Level 1 之后(包括 Level 1 )都是有序的

1 个赞

SST不是按表区分写入
以下我个人理解供参考(不对,大佬们帮忙指正)
因为key大概结构是按照表名+版本号(这里简单化便于解释),SST排序写入后,同一表A的10点写入id=10,假设key值是TAID1000(key实际不是这样,我这个编的),如果10点30表A的update id=20,key值是TAID1030,因为key前面有几个字母可能相同,排序过后,一个表的数据有大概率写到同一region上

memtable ,l0的sst文件是无序的,读取时要全部读取,只有l1及以下才是在cpmpaction时按序排列

1 个赞

“SST 因为对同一个 key,会有多个版本的数据值,对读取也就没那么友好了”
这句话我不太明白
如果比如update更新操作,写入sst文件是按顺序写入的,如果update的这个数据的key比较小,那顺序写入sst里应该也不是顺序排列的呀?

谢谢言简意赅

按照key的顺序写入的。

LSM Tree 只有追加的概念,包括删除数据也是追加一个标记

所以当同一个key,有多个值的时候,就会有多个记录
update 并不是修改原来版本的值,是追加了一个新值,并置为最新版本

1 个赞

这个回答赞

此话题已在最后回复的 1 分钟后被自动关闭。不再允许新回复。