我有一个cassandra表定义,如下
CREATE TABLE mytable
(
colA text,
colB text,
timeCol timestamp,
colC text,
PRIMARY KEY ((colA, colB, timeCol), colC)
) WITH....
当我使用两个不同的查询删除时:
1. delete from mytable where colA = '...' AND colB = '...' and timeCol = 111
2. delete from mytable where colA = '...' AND colB = '...' and timeCol = 111 AND colC = '...'
生成了不同类型和数量的tombstone。请参阅此处https://stackoverflow.com/a/29301627/1439122
考虑到在最终清理/压实过程中同样数量的行受到影响,压实过程的性能是取决于墓碑的数量和类型,还是仅取决于受到影响的行/单元格的数量?
1
是一个范围逻辑删除,2
是一个单元格逻辑删除。我可能错了,但我认为对于大多数用例来说,它可以忽略不计。如果colC的值很多,1
可能会导致更多的逻辑删除或数据在读取时被丢弃(在jvm上稍微困难一点)。在这两者中,我怀疑如果只有一个colC值,2
(稍微)更有效率,但1
删除a/b/time分区中的所有colC要好得多。
我猜是"取决于情况"one_answers"可能无关紧要"。
只要您对删除后的读取进行过多的tombstone扫描,就不会对性能产生任何影响。
在大多数情况下,删除分区会给您带来更好的性能,因为您不再关心那个分区了。
使用cell删除,您可以创建片段,这些片段无论如何都不会在gc_grace_conds中消亡。内部碎片会给您的应用程序和Cassandra带来问题。只要考虑一下Cassandra端的GC,它具有内部碎片数据。这就是你最终会遇到的情况。