Cassandra中的总行数

Cassandra中的总行数,cassandra,cql,cassandra-3.0,Cassandra,Cql,Cassandra 3.0,我完全理解表中的count(*),其中partitionId='test'将返回行数。我可以看出,它所花费的时间与从表中选择*所花费的时间相同,其中partitionId='test 在Cassandra中是否有其他方法可以有效地检索行数 如果运行cqlsh,您可以比较select*和select count(*)的结果,并使用tracing on命令在那里启用跟踪-它将打印执行相应命令所需的时间。两个查询之间的区别只是返回的数据量 但无论如何,为了找到行数,Cassandra需要点击SSTab

我完全理解表中的
count(*),其中partitionId='test'
将返回行数。我可以看出,它所花费的时间与从表中选择*所花费的时间相同,其中partitionId='test


在Cassandra中是否有其他方法可以有效地检索行数

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


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

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

事实上,Cassandra希望避免锁定,因此他们不会在其SSTABLE中维护许多行,每次执行
插入
更新
、或
删除
,实际上可能会覆盖另一个只标记为墓碑的条目(即,它不是就地覆盖,而是将新数据保存在sstable的末尾,并将旧数据标记为死数据)

COUNT(*)
将遍历sstables并对所有未标记为墓碑的条目进行计数。这非常昂贵。我们习惯于SQL具有表或索引中的总行数,因此
COUNT(*)
在这些表上是即时的…不在这里


我使用的一个解决方案是将Elasticsearch安装到您的Cassandra群集上。Elasticsearch保存在其统计数据中的一个参数是表中的行数。我不记得确切的查询,但或多或少您只需一个
count
请求,就可以在100毫秒内得到结果,无论数字是多少。即使在他有上千万行。就像使用
SELECT COUNT(*)…
一样,如果有多个写操作并行进行,结果将始终是近似值。如果写操作停止足够长的时间(可能约1或2秒),结果将稳定.

是每个分区键级别还是表级别需要计数?@dilsingi它是每个分区。除非您想维护一个单独的“计数器”表来获取计数,否则请选择计数(*)是您最好的选择,希望分区是小的。随着分区变大或表级计数即将超时,我正在寻找获得计数的最佳方法:(但我仍然没有得到任何结果,结果是选择计数(*)