tidb数据库 update一条或多条语句中某个字段,没有被update的字段是否被会查询到缓存中?

tidb数据库 update一条或多条语句中某个字段,没有被update的字段是否被会查询到缓存中?
比如下面的update语句:
UPDATE
custom_forms_user_detail
SET
STATUS = ?,
updatetime = ?
WHERE
form_id = ?
AND form_user_id IN (?)
AND STATUS != ? [arguments: (2, 1712562485539, 559969, 984142949, 2)];

mysql数据库中,update语句,相当于先delete后再insert,(相当于这一行所有的字段都会被select到缓存中),但在tidb中是不是也是这样的?

MVCC的原因,tidb都是insert吧

你说的对,应该是insert,但我问的是没有被更新的列,是否会被select到缓存中?

个人理解会的,
大致看了下源码,是要先取出老的数据,然后会有update 的列和没被update的列组合成新的value,这个过程是会把整个原来的整个value读到内存中去的。
:crazy_face:
有时间了可以详细阅读下源码,大概是这个: tidb/pkg/executor/update.go at 3e2f2c5873eae1f5f2e4191f0f2064260e3b86ab · pingcap/tidb (github.com)
我还没有细看,最近也是刚有看源码的冲动

2 个赞

tidb底层用的rocksdb,update insert delete在rocksdb里都是一个操作插入一个新的key-value

update 没专门 blog,大致是类似这一段描述

3 个赞

学习了

tidb更新数据的方式是,先把数据从tikv中查出来,然后放倒缓存中将数据更新掉,然后再把数据持久化到tikv。而且,tidb使用的是mvcc机制,tikv中实际是保持多个副本。比如:修改前的副本,修改后的副本。例如:在查询中,如果查询的tso是在修改后的时间戳之前,那会差到修改前的副本数据。如果是在修改后的时间戳之后,查到修改后的副本数据就不再往下查了。所以,我理解,在修改数据的时候还是会把整条数据拿到缓存中的

会的,tidb update也是插入,你没有update到的字段,需要从原来的kv里面获取出来,重新插入时使用。

取得话应该是将整个value,也就是一个lists数组取到内存中去

个人认为会的。

看原理学习了

学习了~ :+1:

如果涉及key的更新(聚簇索引表的主键或非聚簇索引表的rowid)则是获取整行记录先delete(insert标记)再insert。如果不涉及key的更新则直接insert。

其实我们更常用的涉及大批量数据操作的是delete,但是delete也是需要把整行数据都读取到tidb-server中,主要是因为需要同步tidb-binlog和对索引字段的维护,其实这块我感觉是可以优化的只是代价较大。

应该是会的,每个key-value都是完整的,保留了多个副本

学习了

学习了 :+1:

取出键值对更新再持久化

LSMTREE应该是取出完整行值进行操作