SELECT COUNT(*)返回0但我有800行

时间:2013-10-16 22:58:23

标签: cassandra cql3

我使用Cassandra 2.0和cqlsh:

cqlsh:node1> SELECT count(*) FROM users;

 count
-------
     0

(1 rows)

但是当我这样做时:

cqlsh:node1> select id from users LIMIT 10;

 id
--------------------
 8acecf2
 f638215
 8b33e24
 470a2cb
 0f9a5c2
 4c49298
 2e28a56
 b42ce98
 19b68c5
 2a207f2

(10 rows)

我的用户表有5个“文本”列,其中包含超过100Kb的base64数据。 当我在显示数据之前执行SELECT * FROM users; cqlsh需要3秒钟。

任何人都有解决方案吗?

是否可以制作COUNT(column)

ps:你需要什么?日志?在哪里?

3 个答案:

答案 0 :(得分:1)

计数时需要做的是指定限制:

如果您确定“行”的数量少于5,000,000(5百万)那么您可以在cql3.0中执行:

select count(*) from mycolumnfamilyname limit 5000000;

答案 1 :(得分:0)

您需要重新思考,为什么您的应用程序需要重要。如果您有数百万/十亿行,那么计算将耗费时间/资源。

如果您的应用程序对“大概”用户计数没问题,那么您可以使用“nodetool cfstats”。它将为您提供密钥(用户)估计的数量,并且通常是准确的。

如果您需要“精确”,那么有不同的技术可以做到这一点。

  • 当有新行插入时,您可以维护一个特殊行并继续向其添加列。现在,您可以计算列数以获得行数。

答案 2 :(得分:0)

为了计算特定列,您必须在WHERE子句中包含该列。

例如,假设'id'列是您的主键,您可以这样做:

SELECT COUNT(id) FROM users WHERE id > '';

如果列不是主键,则必须允许过滤,如下所示:

SELECT COUNT(name) FROM users WHERE name > '' ALLOW FILTERING;

正如其他人所提到的,这很慢,如果您期望大量用户,则需要LIMIT关键字。缓慢来自于Cassandra一个接一个地读取所有行并且根据我的理解,它读取整行(即每次都会加载你真正的大列),因为它们没有办法只读一个过滤时的列但Cassandra 3.x现在可能已经改善了。

如果您确实经常需要该号码,则可以使用锁定并增加表示用户数量的字段。如果它以某种方式不同步,你也可以有一个偶尔调整数字的过程。

相关问题