0

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

4

3 回答 3

1

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

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

select count(*) from mycolumnfamilyname limit 5000000;
于 2014-09-12T13:57:54.663 回答
0

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

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

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

  • 当有新的行插入时,您可以维护一个特殊的行并继续向其添加列。现在您可以计算列数以获取行数。
于 2013-10-17T05:03:12.550 回答
0

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

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

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

如果该列不是主键,那么您必须允许过滤,如下所示:

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

As mentioned by others, this is slow and the LIMIT keyword is required if you expect a large number of users. The slowness comes from the fact that Cassandra reads all the rows one by one and from what I understand, it reads the entire rows (i.e. your really big columns will be loaded each time,) because they do not have a way to just read one column when filtering. But Cassandra 3.x may have a ameliorated that now.

If you really need that number often, you could use a lock and increment a field representing the number of users. You could also have a process that adjusts the number once in a while if it gets out of sync, somehow.

于 2016-07-02T01:32:55.087 回答