tidb server的membuffer

为提高效率,请提供以下信息,问题描述清晰能够更快得到解决:

【TiDB 版本】

【问题描述】

TiDB 下推 API 实现细节 - Union Scan https://pingcap.com/blog-cn/tidb-api-union-scan/#下面是这个算法的简介

文章里的描述1:
“UnionStore 的实现是基于 Key Value 的,但是下推 API 返回的结果是基于 Row 的,也就是说,我们虽然有脏数据 Buffer 和下推 API 返回的结果集, 但是我们没有办法把这两部分数据合并在一起, 所以我们为了绕过这个问题,加了一个判断条件,当事务写入了 Buffer,包含了脏数据以后,就不走下推 API,而是使用基础的 KV API”
问题: 读取的keyvalue是否也放入这membuffer内,还是只包含更新后的脏数据?在update操作时直接在buffer中的相应key直接更新还说原位置标记删除然插入一个新的kv到buffer

描述2:
“”我们为每个事务在对某个 table 执行写操作时,创建一个 dirtyTable 保存这个事务的修改,dirtyTable 包含两个 map,一个是 addedRows,用来保存新写入的 row,另一个是 removedRows,用来保存删除的 row,对于不同的操作,我们需要对这两个 map 做不同的操作。
问题: 这里dirtytable和前面的buffer是否共存的,同时保留了2分不同格式的脏数据?

对于问题1 读取的 keyvalue 不放在 membuffer 内。写入在提交之前全部都进 membuffer,读取读出 membuffer 和下面 tikv merge 后的结果 。update 操作直接更新 membuffer 的 key 对应的 value 就行。

问题2 文章比较老了,最新的实现代码已经有了比较大的变化 。以前我们有 dirtyTable 这个结构,现在已经全部放在 membuffer 里面了。你可以理解成,以前同时维护了 dirtyTable 和 membuffer 两个结构,2份不同格式脏数据,一个用于读一个用于写。最新的代码只维护一份 membuffer 了,概念上,dirtyTable 所需要的数据由 membuffer 生成出来。

感谢! 对于Update操作,假如membuffer里没有数据, 1 , 从tikv读取数据 2. update value值。 读出来后的数据放到哪里? 2. 这个文章里提到 以前的设置dirty table 使用为写入时是kv格式,从tikv读取是行结构,不方便merge.在新的版本里 tikv的数据和membuffer里的脏数据是怎样merge的,谢谢!

  1. tikv 读出来的数据直接吐到客户端呀,不需要存放

  2. 现在的 tikv 的数据跟 membuffer 的数据都是一样的 kv 结构,如果某个 kv 在 membuffer 存在,则读到它,如果不存在,则读到 tikv 的。也就是 membuffer 里面的数据优先级高于 tikv 里面的。