Cassandra和Tombstones:创建一行,删除行,重新创建行=性能?

时间:2011-09-03 15:20:48

标签: performance cassandra tombstone

有人可以解释一下,以下过程对墓碑有什么影响:

  

1.)使用键“1”创建“行”(“字段”:用户,密码,日期)

     

2.)用键“1”删除“行”

     

3.)使用键“1”创建“行”(“字段”:用户,密码,logincount)

序列在一个线程中顺序执行(所以这会以相对较高的“速度”=在动作之间没有长时间暂停)。

我的问题:

1。)这对墓碑的创建有什么影响。 2.)创建/存在墓碑后。但是,如果在同一个键下再次创建新的(略微更改的行)(在处理步骤3.)中),现有的逻辑删除会发生什么。 cassandra可以非常有效地“恢复”墓碑吗?)

2。)与仅仅非常有针对性地删除date“字段”然后创建“logincount”字段相比,上述过程有多糟糕? (它很可能性能更高。但相反,找出哪些字段已被删除比仅仅删除整行并使用正确的数据从头开始重新创建要复杂得多......)

备注/更新:

我真正想要做的是将"date"字段设置为null。但这在cassandra中不起作用。值不允许为空。因此,如果我想将其设置为null,我必须将其删除。但是我担心这个明确的第二次删除请求会产生负面的性能影响(相比之下只是将其设置为null)......如上所述,我必须首先找出哪些字段是无效的,并且最重要的是有一个值(我必须比较此状态的所有属性...)

非常感谢! 马库斯

3 个答案:

答案 0 :(得分:6)

我想在这里稍微澄清一些事情。

首先,关于西奥多的答案:

1)为简单起见,所有行内部都有一个墓碑字段,因此当新行与墓碑合并时,它只会变成“包含新数据的行,同时还会记住它曾在时间X删除过”。所以在这方面没有真正的惩罚。

2)说“如果你创建并删除一个足够快的列值,中间没有发生冲洗......那么墓碑就会被丢弃”是不正确的;为了正确,墓碑总是保持不变。也许西奥多想的情况反过来了:如果你删除,然后插入一个新的列值,那么新的列将替换墓碑(就像任何过时的值一样)。这与行情况不同,因为Column是存储的“原子”。

3)给定(2),如果随着时间的推移要删除许多列,则delete-row-and-insert-new-one可能更具性能。但对于单列,差异可以忽略不计。

最后,关于Tyler的回答,在我看来,简单地删除相关列而不是将其值更改为空[byte]字符串更为惯用。

答案 1 :(得分:4)

1)。如果删除整个,则仍会保留逻辑删除,并且不会通过步骤3中的后续插入恢复。这是因为很久以前可能已插入该行(例如步骤0:键“1”,字段“名称”)。行“1”键“名称”需要保持删除,而行“1”键“用户”需要复活。

2)。如果您足够快地创建和删除值,中间不会发生刷新,则不会对性能产生影响。该列将在Memtable中就地更新,并且简单地丢弃墓碑。只有一个值最终会持久写入SSTable。

但是,如果在步骤2和3之间将Memtable刷新到磁盘,则逻辑删除将写入生成的SSTable。随后的刷新会将新值写入下一个SSTable。这将使后续读取速度变慢,因为现在需要从两个SSTable中读取列并进行协调。 (类似地,如果在步骤1和2之间发生刷新。)

答案 2 :(得分:1)

只需将“日期”列设置为包含空字符串即可。这就是通常使用的而不是null。

如果要删除列,只需显式删除列,而不是删除整行。其性能影响类似于为列值写入空字符串。