Cassandra 选择COUNT(*)返回0,但我有800行

Cassandra 选择COUNT(*)返回0,但我有800行,cassandra,cql3,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

我使用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数据。 当我执行
时,从用户中选择*cqlsh显示数据前需要3秒钟

有人有解决办法吗

是否可以进行计数(列)


附言:你需要什么?日志?哪里?

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

如果您的应用程序可以使用“近似”用户数,那么您可以使用“nodetool cfstats”。它会让你估计钥匙(用户)的数量,并且通常是准确的

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

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

计数时需要做什么指定限制:

如果您确定“行”的数量少于5000000(500万),那么您可以在cql3.0中执行以下操作:

select count(*) from mycolumnfamilyname limit 5000000;

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

例如,假设“id”列是主键,可以执行以下操作:

SELECT COUNT(id) FROM users WHERE id > '';
如果该列不是主键,则必须允许筛选,如中所示:

SELECT COUNT(name) FROM users WHERE name > '' ALLOW FILTERING;
正如其他人提到的,这很慢,如果您希望有大量用户,则需要使用
LIMIT
关键字。慢的原因是Cassandra一行一行地读取所有行,据我所知,它读取整行(即每次都会加载非常大的列),因为它们无法在过滤时仅读取一列。但是卡桑德拉3.x现在可能有了一个改进


如果您确实经常需要这个数字,您可以使用一个锁并增加一个表示用户数量的字段。您还可以有一个进程,如果数字不同步,它会偶尔调整一次。

在第一次查询中,您从
用户
表中选择count(*),但在
视频中选择count(*),但在几秒钟内,
@Ilya Bursov我修复了它,只是一个键入错误指定了一个列名来代替(*),并使用了上面的语句w/o'limit。。。。“指定;这至少可以追溯到2.2.3,在与数百万行一起使用时,具有上述性能警告。