聚类键范围查询

时间:2019-07-19 06:17:50

标签: cassandra cql

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

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错误。如何解决这个问题呢?在这方面的任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

您的表的分区键为 id ,聚类键为 time 。为了对聚类键运行范围查询,还需要指定分区键。因此查询应为

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

This答案很好地描述了不同的Cassandra键。

答案 1 :(得分:0)

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

执行此操作的一种方法是使用时间“存储桶”作为分区键。如果您只关心最后5分钟的记录,那么只要您每天没有数百万的新记录,那么“ day”应该有效。如果这样做,那么您需要为“存储桶”使用更小的时间分量。

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进行分区非常适合用于数据分发,但在查询灵活性方面并不能给您太多帮助。