7

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

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

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

3.)使用键“1”创建一个“行”(“字段”:用户、密码、登录计数)

该序列在一个线程中按顺序执行(因此这以相对较高的“速度”发生=动作之间没有长时间的停顿)。

我的问题:

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

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

备注/更新:

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

非常感谢!马库斯

4

3 回答 3

7

我想在这里澄清一些迟来的事情。

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

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

2) 说“如果您创建和删除列值的速度足够快以至于中间没有发生刷新......墓碑[被]简单地丢弃”是不正确的;为了正确起见,墓碑始终存在。也许西奥多的想法是相反的:如果你删除,然后插入一个新的列值,那么新的列会替换墓碑(就像它会替换任何过时的值一样)。这与行的情况不同,因为列是存储的“原子”。

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

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

于 2011-09-07T02:33:17.610 回答
4

1)。如果删除整,则墓碑仍然保留,不会被步骤 3 中的后续插入重新激活。这是因为很久以前可能已经插入了该行(例如步骤 0:键“1”,字段“名称”)。行“1”键“name”需要保持删除状态,而行“1”键“user”被重新激活。

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

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

于 2011-09-05T11:14:10.737 回答
1

只需将“日期”列设置为保存一个空字符串。这就是通常用来代替 null 的内容。

如果要删除列,只需显式删除列,而不是删除整行。这样做的性能效果类似于为列值写入一个空字符串。

于 2011-09-03T21:35:30.560 回答