【问题标题】:Cassandra schema - select by frequently updated columnCassandra 模式 - 按经常更新的列选择
【发布时间】:2023-03-10 18:32:01
【问题描述】:

给定表:

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 范围查询的替代方法是什么?

【问题讨论】:

  • 您的架构将导致宽行...如果您无法更改数据模型并且将始终使用分区键,请尝试二级索引...stackoverflow.com/questions/35719985/…
  • @undefined_variable 你能解释一下'宽行'是什么意思吗?
  • 您最好的选择可能是使用 Postgres 来支持这样的查询模型。
  • 在这种情况下 last_modification_time 更新大约 20 次然后记录变得稳定。鉴于此约束,您是否看到任何支持 last_modification_time 范围查询的数据模型?
  • @undefined_variable 二级索引不起作用 - 索引列上不允许范围查询

标签: cassandra cql cassandra-3.0


【解决方案1】:

有两张桌子怎么样?一个可以保存您要更新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;

【讨论】:

    【解决方案2】:

    一般来说,要进行这样的范围查询,您要进行范围查询的字段必须是组合键的一部分,必须是组合键最右边的元素,以及组合键中的所有其他元素必须指定。在您的情况下,您可以将 PRIMARY KEY 修改为 (a, last_modification_time)。然后就可以了

    SELECT * from t_modifications 
     WHERE a = aval
       AND last_modification_time > beg
       AND last_modification_time < end;
    

    这将为您提供 begend 之间 aval 的所有记录。

    【讨论】:

      猜你喜欢
      • 2012-08-04
      • 2018-05-13
      • 2012-02-25
      • 2022-01-17
      • 2015-11-14
      • 2016-08-19
      • 2015-09-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多