TiDB 中有类似 MySQL 的 buffer pool 用于缓存数据页吗?

【 TiDB 使用环境】测试
【 TiDB 版本】6.5.0
【复现路径】https://docs.pingcap.com/zh/tidb/stable/rocksdb-overview
【遇到的问题:问题现象及影响】

文档中显示:
为了提高读取性能以及减少对磁盘的读取,RocksDB 将存储在磁盘上的文件都按照一定大小切分成 block(默认是 64KB),读取 block 时先去内存中的 BlockCache 中查看该块数据是否存在,存在的话则可以直接从内存中读取而不必访问磁盘。

BlockCache 按照 LRU 算法淘汰低频访问的数据,TiKV 默认将系统总内存大小的 45% 用于 BlockCache

问题:
1)内存中的 BlockCache 可以理解为 MySQL 的 buffer pool 吗?
2)数据写入时不会更新 BlockCache,然后生成脏页吗?

【资源配置】
【附件:截图/日志/监控】

看这个图就很清晰了,类似mysql的buffer pool

tidb 里有 membuffer 缓存池,可以把不经常更新的小表数据刷进去,然后查询就会走缓存啦

谢谢大佬,那么数据写入时也会更新 BlockCache,然后生成脏页吗?

好的,谢谢

写入的时候不会写block cache

好的 :ok_hand:

写入走的路径是:
WAL 先落盘,然后写 memtable,就完事儿了。
后台有线程监视 memtable,当 memtable 大小超过阈值时,switchmemtable,切换成 immutable memtable
然后当 immutable memtable 超过数量后,flush,刷盘。
读走的流程:
找找memtable中是否存在,不存在的话,找找blockcache,如果还不存在,读磁盘,同时把数据更新到blockcache。

由此可见,写入不会冲掉blockcache, blockcache只有一个入口,就是读文件的时候找不到。

但是,写入会冲掉memtable,把之前写入的冲到磁盘上,所以,如果写入的数据立刻要读取,那能从memtable中拿到,如果时间久了,就刷盘了,需要再读一次刷入 blockcache 才行。

1 个赞

谢谢大佬!

此话题已在最后回复的 60 天后被自动关闭。不再允许新回复。