更新数据原理咨询

当A表有3个字段

主键id、
状态status(1或0)
新闻news(大文本字段)

当更新status时原理如下:

方式1:
从tikv获取整行数据到tidb,更新status,然后写入tikv。

方式2:
从tikv获取 id 和status字段的数据到tidb,修改完后之后再与tikv的news合并,然后再写入tikv。

是第1种 ,还是都不对啊?

1赞

发起update在tikv内做一个快照读,判断是否有符合条件的记录,有的话则在tidb内生成修改后的数据,提交时作为新版本写到tikv,以前的记录则因为commit_ts比新写入的早成为旧版本,后续事务读取的是所有版本中最新的。 应该是这样

他关注是按列读取,还是按行读取,这样对 tidb 会有不同的影响

@dba_gc 我理解是按照行加载

通过主键索引读取所在行的信息,加载到 tidb 中,后面的操作 可以按照 h5n1 说的理解

可以参考key-value 的映射关系设计

http://lerencao.github.io/notes/update-in-tidb/

tidb中kv到关系模型的转化是tidb server里面做的,tikv中是没有表结构的,表结构是tidb server读取的pd的元数据,缓存在tidb server中,读取kv数据之后,根据元数据转化成关系模型,理论上kv单独取v的中某个字段应该是无法实现。

表结构应该在tikv,pd只是ID分配,否则PD失败恢复后 表元数据信息就都没了

我的理解是取整行数据到tidb,修改之后再往tikv里面写数据。

但是这样有个问题,当表有大json字段的时候。 可能我只是更新其他字段,但是也会有这个大json字段流量。

如果大批量更新的话对集群压力肯定会变得很大。

所以想确认一下这块具体是怎么实现的。

@h5n1 @xfworld @数据小黑

如果按照官方文档理解就是 取数据到tidb ->修改 ->转换为kv->写入tikv。

写放大~ 这块的问题有 泰坦的解决方案,但是对于读取来说并不好…

后来又出了个方案,目前还在实践中,忘记叫什么了

我理解确实有问题,查了一下,元数据信息存储在tikv中(https://docs.pingcap.com/zh/tidb/stable/tidb-computing/#%E5%85%83%E4%BF%A1%E6%81%AF%E7%AE%A1%E7%90%86),不是pd中

:call_me_hand::call_me_hand::call_me_hand:

我找到这个 PDF了,是个论文,你要看的话,估计要花点时间了
Differentiated Key-Value Storage.pdf (783.4 KB)

:rofl::rofl::rofl: