Cassandra的总行数

时间:2018-02-09 03:17:06

标签: apache cassandra cassandra-3.0

我完全理解232会返回行数。我可以看到它需要与count(*) from table where partitionId = 'test'相同的时间。

Cassandra还有其他替代方法可以有效地检索行数吗?

谢谢,
哈利

2 个答案:

答案 0 :(得分:1)

您可以比较select *&的结果select count(*)如果您运行cqlsh,并使用tracing on命令启用跟踪 - 它将打印执行相应命令所需的时间。两个查询之间的区别仅在于应返回的数据量。

但无论如何,为了找到Cassandra需要命中SSTable和扫描条目的行数 - 如果你在多个SSTable之间分配分区,性能可能会有所不同 - 这可能取决于你对表的压缩策略,这是选择的根据您的阅读/写作模式。

答案 1 :(得分:0)

如Alex Ott所述,COUNT(*)需要遍历整个分区才能知道总数。

事实是,Cassandra希望避免使用锁,因此它们不会在其sstable中保持一定的行数,因此每次您执行INSERTUPDATE或{{1} },您实际上可以覆盖另一个刚刚标记为墓碑的条目(即它不是就地覆盖,而是将新数据保存在sstable的末尾并将旧数据标记为 dead )。

DELETE将通过sstables并计算所有未标记为墓碑的条目。那是非常昂贵的。我们已经习惯于使用SQL来获得表或索引中的总行数,因此这些行上的COUNT(*)是瞬时的……不在这里。

我使用的一种解决方案是在Cassandra集群上安装Elasticsearch。 Elasticsearch保存在其统计信息中的参数之一是表中的行数。我不记得确切的查询,但是无论多少,您都可以只发出COUNT(*)请求,结果总是在100毫秒左右。即使在几千万行中也是如此。就像使用count一样,如果并行发生许多写入操作,则结果始终是近似值。如果写入停止足够长的时间(可能大约1或2秒),它将稳定下来。