1

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

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

我们需要将速度作为主键吗?或者在上面创建一个索引什么的?

在这个例子中,我怎么知道什么时候选择二级索引而不是主键?

是否可以通过将速度作为二级索引来提取最慢的前 k 个人?

我想我的问题也试图解决 Casssandra 中的事情是如何排序的。

4

1 回答 1

2

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

因此,在这种情况下,如果您希望能够快速找到最高值,请创建一个单独的表来保存最高值(或k个值),并在您使用更大的值更新现有表时更新它。

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

至于键 - 我可能正在描绘一个表/cf,其中一行具有一个键值,如“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'ing 实现将它们放入队列中来序列化这些更新。我想到了另一种方法,然后意识到它行不通。;) 但当然,有选择。

编辑:

好吧,也许它会起作用。另一个想法是让每个服务器写自己的行。然后,在读取时,您拉入所有行,将所有数字排序在一起,并拉出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);
于 2014-03-28T21:23:00.460 回答