我想删除比给定时间戳早的表请求中的所有条目。
表的结构请求:
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这是不可能的。
还有哪些方法可以删除表中的旧条目?
谢谢
答案 0 :(得分:1)
主要的是,正如您已经写过的那样,您需要提供一个分区键来执行此类删除。
假设您希望每天删除时间戳少于特定日期的所有请求,为了提高效率,您可以在#34; day&#34;之前更改模型和分区。而不是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
截断 day 组件(例如yyyy-mm-dd
)。如果您需要从多个期间删除,则需要运行一堆并行的DELETE查询,每天一次,并且不要使用IN
。您也可以在分区级别删除,而不是在单元级别删除,这对于读取来说是一个很大的优势。