Cassandra 选择COUNT(*)返回0,但我有800行
我使用Cassandra 2.0和cqlsh: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
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”。它会让你估计钥匙(用户)的数量,并且通常是准确的 如果您需要“精确”,那么有不同的技术可以做到这一点
- 当插入新行时,您可以维护一个特殊行并不断向其中添加列。现在,您可以计算列数以获得行数
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,在与数百万行一起使用时,具有上述性能警告。