我在 Cassandra 中有一些数据。说

create table MyTable {
    id text PRIMARY KEY,
    data text,
    updated_on timestamp
}

我的应用程序除了通过主键 id 查询此数据外,还需要通过 updated_on 时间戳查询它。为了按时间用例完成查询,我尝试了以下操作。
create table MyTable {
    id text PRIMARY KEY,
    data text,
    updated_on timestamp,
    updated_on_minute timestamp
}
  • updated_on_minute 字段上的二级索引。据我了解,不建议在高基数情况下使用二级索引(这是我的情况,因为我可能在同一分钟标记处有很多数据)。此外,我有经常更新的数据,这意味着 updated_on_minute 将不断加速。
  • MaterializedView,以 updated_on_minute 作为分区键,以 id 作为聚类键。我使用的是 cassandra 的 3.9 版本并且刚刚开始使用这些,但是我发现这些 3.11x ( https://github.com/apache/cassandra/blob/cassandra-3.11/NEWS.txt ) 的发行说明,声明它们纯粹是实验性的,并不适用于生产集群。

  • 那么我的选择是什么?我是否只需要维护自己的表来跟踪及时出现的数据?会喜欢这方面的一些意见。

    提前致谢。

    最佳答案

    与往常一样,创建附加表以通过不同的分区键进行查询。

    在你的情况下,表将是

    create table MyTable_by_timestamp {
        id text,
        data text,
        updated_on timestamp,
        Primary key(updated_on, id)
    }
    

    写入两个表 mytable_by_timetamp 和 mytable_by_id。根据分区键updated_on 或id 使用相应的表进行读取。

    根据它尝试解决的用例(查询)复制数据绝对没问题。

    编辑:

    如果担心分区太大,您可以随时将其存储到较小的分区中。例如,上表可以分解为
    create table MyTable_by_timestamp {
        id text,
        data text,
        updated_on timestamp,
        updated_min timestamp,
        Primary key(updated_min, id)
    }
    

    这里我选择了每一分钟作为桶的大小。根据您收到的更新数量,您可以将其更改为秒 (updated_sec) 以进一步减小分区大小。

    关于cassandra - 如果不是物化 View 而不是二级索引,那么在 cassandra 中查询数据的推荐方法是什么,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48876392/

    10-16 16:22
    查看更多