读命中KVcache中的数据,还会去memtable和sstable中读取数据吗?

@论坛小助手 为保证数据一致性,会同时在 KVcache、memtable 和 sstable 中读取数据吗?然后合并读取到的数据,再返回客户端?

2 个赞

根据文档库中的信息,以下是关于 OceanBase 数据库读取数据时的行为的详细解答:

  1. KVCache 的作用
    OceanBase 数据库中的 KVCache 是一种缓存机制,用于加速对 SSTable 数据的访问。当查询命中 KVCache 时,会直接从缓存中获取数据,而无需再次访问磁盘上的 SSTable。这显著提高了查询性能(参考 [文档片段 4])。

  2. MemTable 和 SSTable 的角色

    • MemTable 存储的是增量数据(即最新的写入、更新或删除操作),这些数据以行存的形式保存在内存中。
    • SSTable 存储的是基线数据(即已经转储到磁盘的数据),这些数据以列存的形式保存在磁盘上。
  3. 一致性读取的过程
    为了保证数据的一致性,OceanBase 数据库在读取数据时会综合以下来源的数据:

    • 如果查询命中了 KVCache,则会优先从缓存中读取数据。
    • 同时,OceanBase 数据库还会检查 MemTable 中是否存在对该数据的最新修改(如插入、更新或删除)。这是因为 MemTable 中的数据是最新的,尚未被转储到 SSTable。
    • 最后,如果需要,还会从 SSTable 中读取基线数据,并与 MemTable 和 KVCache 中的数据进行合并(参考 [文档片段 2])。
  4. 数据合并与返回
    在完成上述步骤后,OceanBase 数据库会将从不同来源读取到的数据进行实时融合,确保返回给客户端的数据是强一致的。这意味着即使某些数据已经存在于 KVCache 中,系统仍会检查 MemTable 中是否有更新,以避免返回过期数据。

结论

  • 当读命中 KVCache 中的数据时,OceanBase 数据库仍然会去 MemTable 和 SSTable 中读取数据,以保证数据的一致性。
  • 系统会同时从 KVCache、MemTable 和 SSTable 中读取数据,并将这些数据合并后返回给客户端。

此行为的设计目的是确保 OceanBase 数据库能够提供强一致性的读取体验,即使在高并发场景下也能保证数据的准确性。

更多信息请查看:

  1. 转储和合并概述
  2. 列存 FAQ
  3. MemTable
  4. 产品 FAQ
  5. 转储
  6. 在您开始前
  7. 转储管理概述
  8. 体验并行导入和数据压缩
3 个赞

还是评论区里有大佬啊

3 个赞

确实得跟大佬好好学

2 个赞

都是隐藏大佬!

2 个赞

哈哈!

2 个赞

感觉你有薅积分的嫌疑~~哈哈 :smiley:

有一种情况下,会同时读memtable和sstable中的数据,导致SQL执行性能非常差 :smirk:

1 个赞

啥情况?

合并不正常的情况下,你会发现他扫的数据量比实际的表数据量大很多,其实就是多版本读了。这种情况,手动合并一下就完事了

1 个赞

就是逻辑读大于物理读,有大量的失效数据,没有合并生成最新基线数据。

1 个赞

有创意的想法

1 个赞

使劲抠细节,耗费好多时间哈哈