使用INSERT覆盖cassandra中的行,是否会导致墓碑?

时间:2015-06-25 14:34:56

标签: cassandra cassandra-2.0 tombstone

由于数据量和速度的原因,在我们的情况下,将数据写入Cassandra而不会导致它创建墓碑是至关重要的。目前我们只写了一次,然后再也不需要再次更新行了,只是再次获取数据。

现在有一种情况,我们实际上需要编写数据,然后用更多的数据完成它,一段时间后就完成了。 它可以由任何一个制作;

  1. 使用INSERT(所有数据都可用)再次覆盖行中的所有数据,或

  2. 仅对新数据执行更新。

  3. 最好的方法是什么,牢记速度而不是创建墓碑是重要的?

2 个答案:

答案 0 :(得分:10)

只有在删除数据或使用TTL值时才会创建逻辑删除。

Cassandra与您描述的用例非常吻合。增量添加数据将适用于INSERT和UPDATE语句。如果为同一分区键添加数据,Cassandra会将数据存储在不同的位置。定期运行压缩将再次合并数据以获得单个密钥,以优化访问和可用磁盘空间。这将基于写入值的时间戳发生,但不会创建任何新的逻辑删除。 您可以详细了解Cassandra如何存储数据,例如here

答案 1 :(得分:3)

进行更新以添加新数据或更改数据会更有效。没有必要重写那些不会改变的旧数据,并且让Cassandra重写它是低效的。

当您执行插入或更新时,Cassandra会为每列保留修改时间的时间戳。当您执行读取操作时,Cassandra会根据一致性设置从内存,磁盘和其他副本收集该密钥的所有写入。然后它将合并列数据,以便为每列使用最新值。

当数据在磁盘上压缩时,如果某行的不同列有单独的更新,则这些更新将合并为压缩数据中的单行。

除非您使用更新来设置TTL(生存时间)值,否则您不必担心通过更新来创建逻辑删除。在您的应用程序中,您似乎永远不会删除数据,因此您永远不会有任何墓碑。