我有一个表,用于记录在我的网站上执行的用户活动。我的表结构如下:
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错误。如何解决这个问题呢?在这方面的任何帮助将不胜感激。
答案 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
进行分区非常适合用于数据分发,但在查询灵活性方面并不能给您太多帮助。