2017-03-08 68 views
1

我想用卡桑德拉保存日志,并在以后读麻烦造型卡桑德拉表

以下是我迄今所做的:

CREATE TABLE logs 
(
    id uuid, 
    type int, 
    start_date timestamp, 
    end_date timestamp, 
    ip text, 
    log_event text, 
    user_id text, 
    user_agent text, 
    PRIMARY KEY (id, type, start_date, user_id) 
) WITH CLUSTERING ORDER BY (type ASC, start_date DESC, profil_token ASC); 

我需要总是这种查询:

SELECT * FROM logs WHERE type = 1 AND user_id = 'test' AND start_date = '2017-03-08'; 

我需要不进行身份查询,但我不能,因为ID是我真正的主键

我不明白如何实现这种查询没有允许过滤

回答

1

这取决于如果你需要查询是快速的。如果您没有,并且可以在所有行上进行扫描,则ALLOW FILTERING是您的修补程序。

如果您需要快速查询,您可以重新构造表以便查询前缀,也可以创建新表,反规格化数据以加快查询速度。

我不知道有足够的了解你的使用情况,但使聚集键的user_id一部分可能会为你工作:

PRIMARY KEY (user_id, start_date, type, id) 

但是,这意味着你不能在不知道user_id查找由id (和其他领域)。不过,您可以添加辅助索引。

+1

有了'ALLOW FILTERING',他不会活过来读取超时... – xmas79

+0

非常感谢你,你指着我正确的方向 – Bouki

2

我需要的是总是这种查询:

SELECT * FROM logs WHERE type = 1 AND user_id = 'test' AND start_date = '2017-03-08'; 

如果总是的真正含义总是此表模型是有点不正确。你的模型应该始终查询驱动,所以我想这个模型如下:

CREATE TABLE logs 
(
    id uuid, 
    type int, 
    start_date timestamp, 
    end_date timestamp, 
    event_time timestamp, 
    ip text, 
    log_event text, 
    user_id text, 
    user_agent text, 
    PRIMARY KEY ((type, user_id, start_date), event_time) 
) WITH CLUSTERING ORDER BY (event_time ASC); 

当查询这个表你清楚需要指定typeuser_idstart_date可选新字段event_time来过滤结果。

如果您将原始表建模为满足其他查询,那么只需添加一个像上一个表一样的新表,并远离ALLOW FILTERING

它会工作无瑕。