为什么有人会在一行 Cassandra 中存储多行



我正在寻找在Cassandra中存储嵌套动态文档的方法,并找到了一个演示文稿,他们建议只创建几行并在每行中存储许多JSON对象:https://speakerdeck.com/dzello/store-json-the-hard-way?slide=112

我理解基于属性路径创建列名的想法,并且我知道连接较小的对象通常会导致更高的吞吐量,但我只是认为这是很多开销。

在 C* 中,每行存储一个对象的性能真的如此糟糕,以至于值得在创建列表时弄得一团糟吗?关于 C* 我是否缺少一些东西?

在 Store Json the Hard Way 幻灯片中,应该注意的是,这些是 Cassandra 的专家,他们在 Cassandra 的正常操作之外进行了大量的辅助压实和墓碑清理。

数据局部性是实现卓越性能的关键,在单个 C* 分区中具有多个逻辑行是关键。所有 CQL 架构定义都旨在使开发人员能够更轻松地指定同一分区中的数据。

举个例子

CREATE TABLE soda_sold_per_store ( 
    store text, date timestamp, soda_name text, soda_count int, 
    PRIMARY KEY (store,date,soda_count,soda_name)

描述一个表,其中每个存储只有一个 Cassandra 分区,在该分区中,信息根据日期排序,然后soda_count,最后根据soda_name排序。

这意味着查询一段时间

内在特定商店销售的苏打水数量将非常快(它们只命中已在磁盘上排序的连续数据的单个分区(。但是,其他查询在此架构上会非常困难,例如"特定日期所有商店售出的苏打水总数是多少?涉及所有存储的查询需要使用此表从所有节点接收数据,并且数据在磁盘上不会是连续的。Cassandra 施加了这种权衡,建模良好的表将非常快,但它们只能用于某些查询。幸运的是,用Cassandra编写非常便宜,因此通常的做法是有多个表,每个表都满足一个高需求查询。

最新更新