【问题标题】:How do you make querying and extracting largest values from Cassandra fast?如何快速从 Cassandra 中查询和提取最大值?
【发布时间】:2014-03-29 06:04:45
【问题描述】:

如果我想在 Cassandra 中快速查询一张表并从中提取最大值,应该如何设计列族?

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

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

在本例中,我如何知道何时选择二级索引而不是主键?

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

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

【问题讨论】:

    标签: cassandra cql cassandra-2.0


    【解决方案1】:

    在后关系 (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);
    

    【讨论】:

    • 在你的第一个例子中,当我们得到比slowest_response1 或slowest_response2 慢的东西时,我们是否只是适当地替换两者中的一个?
    • @Pinocchio - 我还没有做你正在尝试的事情,但这是我会尝试的方法。
    • 也许最简单的方法是从行中提取所有值,将它们放入带有新值的列表中,对它们进行排序,然后将顶部 k 拉回写回出去。我担心这都是额外的开销。它可能会被你已经在做的处理所淹没,也可能不会,所以你可能需要尝试一些优化。
    猜你喜欢
    • 2020-03-29
    • 1970-01-01
    • 2022-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-01
    • 1970-01-01
    相关资源
    最近更新 更多