2017-01-12 21 views
0

我想刪除表中比給定時間戳更早的請求中的所有條目。刪除時間戳比給定時間戳更早的卡桑德拉表條目

表要求的結構:

CREATE TABLE requests (
    request_id uuid, 
    request_timestamp timestamp, 
    PRIMARY KEY (request_id, request_timestamp) 
) WITH CLUSTERING ORDER BY (request_timestamp ASC) 

顯然,下面的查詢是不行的,因爲主鍵REQUEST_ID必須指定:

Delete from Requests where request_timestamp < givenTimestamp; 

但是,當我有一個巨大的表數百萬個條目,使用帶有IN子句的查詢將不太理想:

Delete from Requests where request_id in (id1, id2.....) and request_timestamp < givenTimestamp; 

一個選項將使用TTL(生存時間),但我們想要保持條目的TTL可配置並且使用TTL,這是不可能的。

還有哪些方法可以從表中刪除舊條目?

感謝

回答

1

主要的是,因爲你已經寫了,你需要提供一個分區鍵來執行這樣的刪除。

假設您想要刪除時間戳小於特定日期的所有請求,爲了高效地使用「日」而不是request_id來更改模型和分區。類似:

CREATE TABLE requests (
    day timestamp, 
    request_id uuid, 
    request_timestamp timestamp, 
    PRIMARY KEY (day, request_timestamp, request_id) 
) WITH CLUSTERING ORDER BY (request_timestamp ASC, request_id ASC) 

day填充了request_timestamp截斷僅組件(例如yyyy-mm-dd)。如果您需要從多個時段刪除,則需要運行大量並行DELETE查詢(每天一個),並且不要使用IN。你也可以在分區級別刪除,而不是在單元級別刪除,這對於讀取來說是一個很大的優勢。