卡桑德拉模式 - 选择通过频繁更新的列
问题描述:
CREATE TABLE T (
a int,
last_modification_time timestamp,
b int,
PRIMARY KEY (a)
);
我经常更新记录。对于每个更新last_modification_time
设置为now()
并且还设置了其他字段。
什么是正确的卡桑德拉方法能够查询last_modification_time
范围?我需要这样的查询:
select * from .. where a=Z and last_modification_time < X and last_modification_time > Y;
一种方法是创建物化视图与PRIMARY KEY (a, last_modification_time)
,但我想避免这种情况,因为物化视图是3.X版本卡桑德拉车。
什么是last_modification_time
查询的替代方法last_modification_time
经常更新?
答
有两张桌子怎么样?你可以在当前快照中保存更新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;
您的架构将导致宽行......如果你不能改变数据模型,并将始终使用分区键尝试二级索引... https://stackoverflow.com/questions/35719985/range-query-on-secondary-index-in-cassandra –
@undefined_variable你能澄清你是什么意思是“宽行”? –
你最好的选择是使用Postgres来支持这样的查询模型。 – Aaron