2017-03-08 91 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

它會工作無瑕。