几列的Cassandra行读取性能下降

时间:2013-06-15 20:31:35

标签: database performance cassandra

我从单行读取数据时遇到Cassandra v1.2.5性能下降,其中只有少数列或零列,但之前添加和删除了许多不同的列。

要测试我会执行以下操作:

  • 创建新的列族
  • 测量一行的读取速度100次 - 每次读取的平均ms为4.6 ms,返回零列
  • 向行添加500000列
  • 从行中删除了所有500000
  • 再次测量读取速度100次 - 每次读取平均ms为282.4 ms,返回零列

因此,读数变得比我添加和删除500000列之前慢了约70倍。

尝试紧凑,齐平,修复 - 没有任何帮助。速度有点提高到208.7毫秒

唯一有助于恢复读取性能的是完全删除行。 写入和读取其他行仍然很快。

为什么这会降低读取速度?以及如何解决?

1 个答案:

答案 0 :(得分:2)

退化是因为墓碑。 Cassandra不能只删除列,因为如果副本没有收到删除,那么当该节点重新联机时,列将重新出现。出于这个原因,Cassandra将删除存储为墓碑,这些墓碑就像值一样,但带有标记,表示列已被删除。

在gc_grace_seconds之后删除墓碑。到这个时候,假设所有副本都会看到删除,因此可以安全地删除墓碑。默认值为10天。你可以控制它(按列系列) - 如果在你的用例中你删除了一致性级别ALL,或者恢复生命的列并不重要,你甚至可以将它降低到0。

或者,如果要删除整行,可以执行行删除而不是删除单个列。这会插入一个行逻辑删除,在压缩之后,意味着读取该行应该与从未插入现在已删除的列一样快。