2013-10-16 155 views
0

我用卡珊德拉2.0和cqlsh:SELECT COUNT(*)返回0,但我有800行

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:你需要什么?日志?哪里?

+1

在第一个查询中,您从用户表中选择了count(*),但是从视频中选择了秒。 –

+0

@Ilya Bursov我修复了它,只是输入错误 –

回答

0

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

如果您的应用程序对于“近似”计数的用户可以,那么您可以使用“nodetool cfstats”。它会让你的密钥数量(用户)估计和一般准确。

如果你需要“确切”,那么有不同的技术来做到这一点。

  • 当有新行插入时,您可以维护一个特殊行并不断添加列。现在您可以计算列数来获取行数。
+0

谢谢你的回答。 –

1

需要算起做什么是指定一个限制:

,如果你确信“行”的数量小于500万(500万),那么你可以在cql3.0做到:

select count(*) from mycolumnfamilyname limit 5000000; 
+0

我指定了一个列名代替(*),并使用了上面的语句,没有使用“限制...”这个名称;至少可以回到2.2.3,上面提到了与数百万的行。 – Jess

0

为了统计特定的列,您必须具有WHERE子句中的列。

例如,假设“ID”列是主键,你可以这样做:

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

如果列不是主键,那么你必须允许过滤为:

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

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

如果你真的需要这个数字,你可以使用锁定并增加一个代表用户数量的字段。不知何故,如果它不同步,你也可以有一段时间调整数字的过程。