tidb和tikv,查询一行记录,是缓存一行,还是缓存了一个region?

查询的最小的单位是什么?

缓存的是结果集,不是一个Region,如果是缓存的Region,那内存消耗太大了。

比如tikv,如果缓存的是结果集,而不是region,就很难解决逻辑io的问题了,每次都要去扫描磁盘了吧

缓存的是结果集。

缓存的是结果集的键值对吧,应该包含主键

肯定不是一个region,应该是一个集合

tidb不缓存,tikv缓存的是原始数据键值对,不是结果吧

TiDB Server LRU缓存
TIKV是下推计算结果缓存

tidb-server 缓存内容之一是“下推计算结果”: 下推计算结果缓存 | PingCAP 文档中心
tikv-server
Block-cache 缓存的是数据块,os 磁盘的读取最小单位是 数据块

1 个赞

缓存以 Region 为单位。对 Region 的写入会导致涉及该 Region 的缓存失效。基于此原因,该功能主要会对很少变更的数据有效果。

这里的下推结果,文档还是说以region为单位,是吧
tidb是物理的4k块?而不是逻辑单位?

tikv-client.copr-cache默认并不会开

关掉的是因为碰到什么问题了吗?

region 是 tidb 数据库的,和 os 是两个角度

你说的是tidb的那个coprocessor cache吗?

如果是coprocessor cache 是这样工作的:
tidb的所有查询会以 region 为单位拆分开。假如说需要扫描一批数据,会下推到 扫描各个region的一批数据,那对应的过滤条件走完后就扫描到了这些数据。

这些结果如果超出了缓存从阈值,就缓存起来,下次直接去对应的reigon读取一下apply index,如果region没有过变更,cache就有效,可以继续用。否则就失效,从region中读取数据。

没关吧,我看默认是1G缓存啊。哪个版本关了?我一直用着很好的啊。

tikv-client.copr-cache 从 v4.0.0 版本开始引入

本部分介绍 Coprocessor Cache 相关的配置项。

capacity-mb

  • 缓存的总数据量大小。当缓存空间满时,旧缓存条目将被逐出。值为 0.0 时表示关闭 Coprocessor Cache。
  • 默认值:1000.0
  • 单位:MB
  • 类型:Float

缓存以 Region 为单位。对 Region 的写入会导致涉及该 Region 的缓存失效。基于此原因,该功能主要会对很少变更的数据有效果。

这句话很明显最小的单位是region吧?

不是整个region的数据都缓存上来,是针对一次扫描的结果缓存起来。这个我看过代码,没疑问。

至于缓存失效,毕竟几万个region,也不是每次都所有更新的。

另外每次查询都可以看到coprocessor的cache命中情况。explain看下就行

嗯好嗯好

下面是cache的代码和用cache的代码,逻辑很清晰。
https://github.com/pingcap/tidb/blob/master/pkg/store/copr/coprocessor_cache.go
https://github.com/pingcap/tidb/blob/master/pkg/store/copr/coprocessor.go#L1698

好的,感谢