你如何快速查询并从Cassandra中提取最大值?

时间:2014-03-28 21:06:53

标签: cassandra cql cassandra-2.0

如果我希望能够快速查询Cassandra中的表并从中提取最大值,那么应该如何为其设计列族?

例如,如果我有一个人名为ID的表,并且我也为每个人存储他们的速度,我如何设计表格以便我可以尽可能快地查询最慢的人?

我们需要将速度变为主键吗?或者在它上面创建一个索引?

在此示例中,如何知道何时在主键上选择辅助索引?

是否有可能通过仅仅将速度提升为二级指数来提取最慢的人?

我想我的问题也试图解决Casssandra中事情的排序方式。

1 个答案:

答案 0 :(得分:2)

在后关系(NoSQL)数据库世界中,规范化不是关系世界的标准化,因此不要害怕在多个地方编写相同的数据。

因此,在这种情况下,如果您希望能够快速找到最高值,请创建一个包含最高值(或 k 值)的单独表格,并在每次“'使用更大的值重新更新现有表。

针对查询优化表,并根据需要调整您编写的内容。

至于关键 - 我可能想象一个表/ cf,其中一行有一个关键值,如#34; slowestusers"和该行上的一个值或一系列值。

CREATE TABLE slow_responses (
    id varchar PRIMARY KEY,
    slowest_response1 bigint,
    slowest_response2 bigint
);

INSERT INTO slow_responses (id, slowest_response1) VALUES ('slowestusers', 1200);
INSERT INTO slow_responses (id, slowest_response2) VALUES ('slowestusers', 1301);

如果您有多台服务器更新这些值,则会出现问题,如果您需要,则必须考虑这些问题。

编辑:

关于如何对此进行多服务器更新的进一步想法。一个是你可以通过使用你最喜欢的q实现将它们放入队列来序列化这些更新。我想到了另一种方式,然后意识到它不会起作用。 ;)但肯定有选择。

编辑:

好吧,也许它会起作用。另一个想法是让每个服务器编写自己的行。然后,在读取时,您拉入所有行,将所有数字排序在一起,并拉出 k 最高值。

CREATE TABLE slow_responses (
    id varchar,
    server varchar,
    slowest_response1 bigint,
    slowest_response2 bigint,
    PRIMARY KEY (id, server)
);

-- server1 writes like:
INSERT INTO slow_responses (id, server, slowest_response1) VALUES ('slowestusers', 'node1', 1200);
INSERT INTO slow_responses (id, server, slowest_response2) VALUES ('slowestusers', 'node1', 1301);

-- server2 writes like:
INSERT INTO slow_responses (id, server, slowest_response1) VALUES ('slowestusers', 'node2', 800);
INSERT INTO slow_responses (id, server, slowest_response2) VALUES ('slowestusers', 'node2', 765);