【问题标题】:Cassandra Data Model without secondary index没有二级索引的 Cassandra 数据模型
【发布时间】:2021-05-15 16:32:20
【问题描述】:

我有一张桌子

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. 将批次中的记录标记为“已处理”

为这张桌子建模的最佳方法是什么?我们无法将已处理添加到集群列,因为我们将无法更新它。我们的想法已经不多了。

谢谢

【问题讨论】:

    标签: cassandra nosql data-modeling


    【解决方案1】:

    这种情况使您看起来像是在尝试将 Cassandra 用作(未处理事件的)队列,这是一种反模式(您可以看到我对类似情况的另一个答案:other answer)。

    将状态设置为分区列或集群列将使其无法更新,因此还需要删除,可能还需要先读再写,而且除了开销之外还会创建墓碑。

    正如您提到的,您自己在 2 值字段上建立索引会产生问题。

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

    【讨论】:

    • 谢谢。这很有意义。
    猜你喜欢
    • 2019-10-08
    • 1970-01-01
    • 2015-11-05
    • 1970-01-01
    • 2013-07-25
    • 1970-01-01
    • 2015-06-10
    • 2016-06-29
    • 2012-12-17
    相关资源
    最近更新 更多