【问题标题】:Range query on clustering key聚类键的范围查询
【发布时间】:2019-07-20 23:25:24
【问题描述】:

我有一张表格,用于记录在我的网站上执行的用户活动。我的表结构如下:

CREATE TABLE key_space.log (
    id uuid,
    time bigint,
    ip text,
    url text,
    user_id int,
    PRIMARY KEY (id, time)
) WITH CLUSTERING ORDER BY (time DESC)

现在我想获取最近 5 分钟内的所有记录。

为了做同样的事情,我正在使用

select * from key_space.log where 
  time>current_timestamp - 5 minutes ALLOW FILTERING;

但是这个查询没有返回任何结果并且我得到了 timedoutexception 错误。如何解决这个问题呢?对此的任何帮助将不胜感激。

【问题讨论】:

    标签: cassandra cql


    【解决方案1】:

    与所有 Cassandra 模型一样,您需要首先构建一个表专门设计来支持该查询。即使您可以使其与当前表一起工作,它也必须扫描集群中的每个节点,这可能会超时(如您所见)。

    一种方法是使用时间“桶”作为分区键。如果您只关心最后 5 分钟的记录,那么“一天”应该可以工作,只要您每天没有获得数百万条新记录。如果这样做,那么您的“存储桶”将需要更小的时间组件。

    CREATE TABLE log_by_day (
        id uuid,
        day bigint,
        time bigint,
        ip text,
        url text,
        user_id int,
        PRIMARY KEY (day, time, id)
    ) WITH CLUSTERING ORDER BY (time DESC, id ASC);
    

    现在这样的查询将起作用:

    aaron@cqlsh:stackoverflow> SELECT day,time,id,user_id FROM log_by_day
      WHERE day=201920 AND time > 1563635871941;
    
     day    | time          | id                                   | user_id
    --------+---------------+--------------------------------------+---------
     201920 | 1563635872259 | 7fef03da-6c23-4bf2-9e98-fd126ab17944 |    1234
     201920 | 1563635872259 | 9a0c49ce-5ad2-45c5-b570-cd9de1c060d1 |    4607
     201920 | 1563635872209 | 9227166e-cda2-4909-b8ac-4168922a0128 |    2112
    
    (3 rows)
    

    专业提示:在唯一的 id 上进行分区非常适合数据分发,但不会为您提供太多查询灵活性。

    【讨论】:

      【解决方案2】:

      您的表将 id 作为分区键,将 time 作为集群键。为了对集群键运行范围查询,您还需要指定分区键。所以查询应该是

       select * from key_space.log where id="xyz" and time>current_timestamp - 5 minutes ALLOW FILTERING;
      

      This 回答很好地描述了不同的 Cassandra 密钥。

      【讨论】:

      • 我必须获取所有记录,而不仅仅是 id xyz 的记录。
      • 这在 Cassandra 中是不可能的。即使您将“时间”移动到分区键,也不能在分区键上运行范围查询。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-06
      相关资源
      最近更新 更多