没有二级索引的 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。
我的访问模式看起来像
- 获取一小批未处理的记录
- 处理它们
- 将批次中的记录标记为“已处理”
建模此 table 的最佳方法是什么?我们无法将 processed 添加到集群列,因为我们将无法更新它。我们 运行 没主意了。
谢谢
这种情况让人觉得您正在尝试将 Cassandra 用作(未处理事件的)队列,这是一种反模式(您可以看到我对类似情况的另一个回答: ).
具有分区列或集群列的状态将无法进行更新,因此还需要删除,可能还需要先读后写,除了开销之外,还会创建墓碑。
另外,正如您提到的,在 2 值字段上有索引会产生问题。
我不会在这里复制粘贴我的其他答案,但我很确定这里的内容也可以解决您的问题(使用 Kafka 之类的东西似乎是您所需要的)。
干杯!
我有一个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。
我的访问模式看起来像
- 获取一小批未处理的记录
- 处理它们
- 将批次中的记录标记为“已处理”
建模此 table 的最佳方法是什么?我们无法将 processed 添加到集群列,因为我们将无法更新它。我们 运行 没主意了。
谢谢
这种情况让人觉得您正在尝试将 Cassandra 用作(未处理事件的)队列,这是一种反模式(您可以看到我对类似情况的另一个回答:
具有分区列或集群列的状态将无法进行更新,因此还需要删除,可能还需要先读后写,除了开销之外,还会创建墓碑。
另外,正如您提到的,在 2 值字段上有索引会产生问题。
我不会在这里复制粘贴我的其他答案,但我很确定这里的内容也可以解决您的问题(使用 Kafka 之类的东西似乎是您所需要的)。 干杯!