@论坛小助手 为保证数据一致性,会同时在 KVcache、memtable 和 sstable 中读取数据吗?然后合并读取到的数据,再返回客户端?
2 个赞
根据文档库中的信息,以下是关于 OceanBase 数据库读取数据时的行为的详细解答:
-
KVCache 的作用
OceanBase 数据库中的KVCache
是一种缓存机制,用于加速对 SSTable 数据的访问。当查询命中KVCache
时,会直接从缓存中获取数据,而无需再次访问磁盘上的 SSTable。这显著提高了查询性能(参考 [文档片段 4])。 -
MemTable 和 SSTable 的角色
- MemTable 存储的是增量数据(即最新的写入、更新或删除操作),这些数据以行存的形式保存在内存中。
- SSTable 存储的是基线数据(即已经转储到磁盘的数据),这些数据以列存的形式保存在磁盘上。
-
一致性读取的过程
为了保证数据的一致性,OceanBase 数据库在读取数据时会综合以下来源的数据:- 如果查询命中了
KVCache
,则会优先从缓存中读取数据。 - 同时,OceanBase 数据库还会检查 MemTable 中是否存在对该数据的最新修改(如插入、更新或删除)。这是因为 MemTable 中的数据是最新的,尚未被转储到 SSTable。
- 最后,如果需要,还会从 SSTable 中读取基线数据,并与 MemTable 和 KVCache 中的数据进行合并(参考 [文档片段 2])。
- 如果查询命中了
-
数据合并与返回
在完成上述步骤后,OceanBase 数据库会将从不同来源读取到的数据进行实时融合,确保返回给客户端的数据是强一致的。这意味着即使某些数据已经存在于KVCache
中,系统仍会检查 MemTable 中是否有更新,以避免返回过期数据。
结论
- 当读命中
KVCache
中的数据时,OceanBase 数据库仍然会去 MemTable 和 SSTable 中读取数据,以保证数据的一致性。 - 系统会同时从
KVCache
、MemTable 和 SSTable 中读取数据,并将这些数据合并后返回给客户端。
此行为的设计目的是确保 OceanBase 数据库能够提供强一致性的读取体验,即使在高并发场景下也能保证数据的准确性。
更多信息请查看:
3 个赞
还是评论区里有大佬啊
3 个赞
确实得跟大佬好好学
2 个赞
都是隐藏大佬!
2 个赞
哈哈!
2 个赞
感觉你有薅积分的嫌疑~~哈哈
有一种情况下,会同时读memtable和sstable中的数据,导致SQL执行性能非常差
1 个赞
啥情况?
合并不正常的情况下,你会发现他扫的数据量比实际的表数据量大很多,其实就是多版本读了。这种情况,手动合并一下就完事了
1 个赞
就是逻辑读大于物理读,有大量的失效数据,没有合并生成最新基线数据。
1 个赞
有创意的想法
1 个赞
使劲抠细节,耗费好多时间哈哈