如果我希望能够快速查询Cassandra中的表并从中提取最大值,那么应该如何为其设计列族?
例如,如果我有一个人名为ID的表,并且我也为每个人存储他们的速度,我如何设计表格以便我可以尽可能快地查询最慢的人?
我们需要将速度变为主键吗?或者在它上面创建一个索引?
在此示例中,如何知道何时在主键上选择辅助索引?
是否有可能通过仅仅将速度提升为二级指数来提取最慢的人?
我想我的问题也试图解决Casssandra中事情的排序方式。
答案 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);