这几天看了ob的读写流程;联想到了tidb的rocksdb。。。
如果tidb的user表有3个字段。id,name,age;如果我执行了update user set age=18 where id=1;
1、是不是memtable更新的时候,只有age,id两个字段?
2、查询的时候select * from user where id=1,是不是查询了memtable的age,id数据,还需要查询sstable的name,id数据。。然后把他们组装在一起;在返回??
下图来自ob:
这几天看了ob的读写流程;联想到了tidb的rocksdb。。。
如果tidb的user表有3个字段。id,name,age;如果我执行了update user set age=18 where id=1;
1、是不是memtable更新的时候,只有age,id两个字段?
2、查询的时候select * from user where id=1,是不是查询了memtable的age,id数据,还需要查询sstable的name,id数据。。然后把他们组装在一起;在返回??
下图来自ob:
1、不是,更新的时候,会新插入整行数据,并将修改的字段改为新的值。
2、不是,也是整行获取
先查memtable, 再查inmates mentable, 再按等级从低到高查磁盘,用布隆过滤器
Immutable MemTable,说错了
这不是跟OB差不多得技术吗
tidb底层的rocksdb是kv数据库,key是主键,value是这一行的全部数据。
你更新数据,会向memtable里面插入一条新数据,而不是修改原来的数据。
rocksdb没有修改功能,只能新增和删除
tidb:如果只更新一个字段;那么还需要查询其它的字段。。更新的字段+原先的字段 组装成insert。。就是update的时候,多了一个select。
ob:update的时候,只有insert。。没有select
不是的, TiDB 底层(TiKV)是以「整行」为单位存储的(基于 RocksDB 的 Key-Value 模型,而非列存),即使只更新 age 字段,Memtable 中写入的也是 包含 id=1 的整行新版本数据 (id+name+age,其中 age=18,name 继承旧值),而非仅更新的字段 + 主键。
感觉这位大佬说的对
此话题已在最后回复的 7 天后被自动关闭。不再允许新回复。