为什么我的读操作会转到SSTable,而更新的数据在Memtable中?

问题描述 投票:0回答:1

我有(id,data)格式的数据,例如(1,“someDataS”)。

  • 最初,当我插入数据时,数据存储在Memtable中,并直接从Memtable中读取pull。
  • 插入更多数据后,会刷新到SSTable。此时,读取开始从 SSTable 检索数据,这是有意义的。

但是,我对更新 SSTable 中已有的旧数据后会发生什么感到困惑。

例如,如果我更新 SSTable 中当前的数据项,我希望 Memtable 保存新版本,而旧版本保留在 SSTable 中。但是当我在此更新后执行读取时,它仍然检查 SSTable,即使较新的版本应该位于 Memtable 中。

问题:为什么读操作不直接从存储最新版本的Memtable返回更新的数据?它仍然检查 SSTable 是否有原因?

我使用查询跟踪功能来调试它,它让我相信相关代码位于以下文件中 https://github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/db/SinglePartitionReadCommand.java

更具体的“queryMemtableAndSSTablesInTimestampOrder”方法。在我看来,它总是检查 sstable。

cassandra
1个回答
0
投票

在更广泛的用户案例中 - 仅从 memtable 中不一定可以知道 sstable 中没有您不需要的内容。

示例:

  • memtable 包含列的子集,其他列在之前的操作中设置。
  • memtable 可以包含未冻结集合的一部分,sstable 包含集合的其余部分。
  • sstable 可以包含带有未来写入时间戳的数据,该时间戳可以取代 memtable 中的数据。 (使用
    using timestamp
    语法编写)
  • sstable可以有一个未来的墓碑,使得memtable中的数据被删除。 (再次使用
    usint timestamp
    语法)

最后 2 个具体意味着没有特定场景允许基于表模式进行微优化,您可以消除前 2 个场景的潜力。

© www.soinside.com 2019 - 2024. All rights reserved.