没有二级索引的 Cassandra 数据模型

Cassandra Data Model without secondary index

我有一个table

CREATE TABLE tablea (
    hour text,
    key_mod int,
    processed int,
    column1 bigint,
    column2 biginit,
    column3 biginit,
    PRIMARY KEY ((event_hour, key_mod, processed), item_id, variation_id) 

CREATE INDEX processed_idx ON tablea (processed);

已处理有两个值 - 1 表示已处理 0 表示未处理

SELECT * FROM tablea WHERE hour=? AND key_mod=? AND p1='N' LIMIT 300;

这会创建一个巨大的二级索引,我感觉它也会导致频繁的 gc。

我的访问模式看起来像

  1. 获取一小批未处理的记录
  2. 处理它们
  3. 将批次中的记录标记为“已处理”

建模此 table 的最佳方法是什么?我们无法将 processed 添加到集群列,因为我们将无法更新它。我们 运行 没主意了。

谢谢

这种情况让人觉得您正在尝试将 Cassandra 用作(未处理事件的)队列,这是一种反模式(您可以看到我对类似情况的另一个回答: ).

具有分区列或集群列的状态将无法进行更新,因此还需要删除,可能还需要先读后写,除了开销之外,还会创建墓碑。

另外,正如您提到的,在 2 值字段上有索引会产生问题。

我不会在这里复制粘贴我的其他答案,但我很确定这里的内容也可以解决您的问题(使用 Kafka 之类的东西似乎是您所需要的)。 干杯!