给出表:
CREATE TABLE T (
a int,
last_modification_time timestamp,
b int,
PRIMARY KEY (a)
);
我经常更新记录。每次更新last_modification_time
都设置为now()
,并且还会设置其他字段。
能够按last_modification_time
范围查询的cassandra方法是什么?我需要像这样查询:
select * from .. where a=Z and last_modification_time < X and last_modification_time > Y;
一种方法是使用PRIMARY KEY (a, last_modification_time)
创建实体化视图,但我想避免这种情况,因为3.X cassandra版本中的实体化视图存在错误。
last_modification_time
给定last_modification_time
范围内的查询替代方法经常更新?
答案 0 :(得分:0)
有两张桌子怎么样?你可以保存当前快照,你正在更新last_modification_time
字段和另一个保存随时间变化的字段(类似历史表)?您可以使用BATCH
语句写入它们。
CREATE TABLE t_modifications (
a int,
last_modification_time timestamp,
b int,
PRIMARY KEY (a, last_modification_time)
) WITH CLUSTERING ORDER BY (last_modificaton_time DESC);
BEGIN BATCH
UPDATE T SET last_modification_time = 123, b = 4 WHERE a = 2;
INSERT INTO t_modifications (a, last_modification_time, b) values (2, 123, 4);
APPLY BATCH;
如果您对给定修改范围内的最新快照感兴趣,可以选择并限制t_modifications
表:
SELECT * FROM t_modifications WHERE a = 2 AND last_modification_time < 136 LIMIT 1;
答案 1 :(得分:0)
通常,要进行这样的范围查询,要作为范围的字段必须是组合键的一部分,必须是组合键的最右边的元素,以及组合键中的所有其他元素必须指定。在您的情况下,您可以将主键修改为(a,last_modification_time)。然后,您可以
SELECT * from t_modifications
WHERE a = aval
AND last_modification_time > beg
AND last_modification_time < end;
这将为您提供 begg 和 end 之间的 aval 的所有记录。