我使用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:你需要什么?日志?在哪里?
答案 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现在可能已经改善了。
如果您确实经常需要该号码,则可以使用锁定并增加表示用户数量的字段。如果它以某种方式不同步,你也可以有一个偶尔调整数字的过程。