具有更新的Cassandra群集订单[性能]

时间:2019-07-02 14:13:31

标签: cassandra cassandra-3.0

使用Cassandra,可以在具有特定列的表上指定集群顺序。

CREATE TABLE myTable (
    user_id INT,
    message TEXT,
    modified DATE,
    PRIMARY KEY ((user_id), modified)
)
WITH CLUSTERING ORDER BY (modified DESC);

注意:在此示例中,每个user_id(预期)有一条消息

鉴于此表,我的理解是,在查询最新数据的情况下,查询的性能会更好。

但是,如果在“修改”列中进行更新,是否会增加服务器的额外开销以“重新排序”,并且该开销与查询性能之间是否显着相关?

换句话说,给定该表,如果删除“ CLUSTERING ORDER BY(修改后的DESC)”会更好吗?

更新:通过将修改添加到主键来更新无效的CQL,但是,原始问题仍然存在。

3 个答案:

答案 0 :(得分:1)

为了修改聚类列,需要在主键中定义它。

# handle only one 1 message and then stop the route
camel.springboot.duration-max-messages=1
# run for 180 seconds and then gracefully shutdown
camel.springboot.duration-max-seconds=180
# a polling consumer will cancel the graceful shutdown so set the shutdownTimeout to a minimum
camel.springboot.shutdownTimeout=1

这样,您的数据将主要按照user_id的哈希值进行排序,并在每个user_id中进行修改。您无需删除“ WITH CLUSTERING ORDER BY(修改后的DESC)”

答案 1 :(得分:0)

将评论作为回答,作为对更新问题的答复:

  

如果要在“修改的”列中进行更新的地方添加   服务器上的额外开销可以“重新排序”,那是开销vs   查询性能显着吗?

如果将modified定义为集群键的一部分,则您将无法to update that record,但是将能够根据需要添加任意多的记录,每次记录的修改日期都不同。

Cassandra是仅允许追加的数据库引擎:这意味着对记录的任何更新都将添加具有不同时间戳的新记录,而select将考虑具有最新时间戳的记录。这意味着没有“重新排序”操作。

应在如何检索信息的查询的基础上定义拖放或创建聚类顺序,如果仅使用该user_id的最新记录,则按照定义的顺序进行聚类是有意义的它。

答案 2 :(得分:0)

在数据模型中,

user_id是对数据局部性很重要的行键/分区键/分区键(用户ID),并且群集列(已修改)指定了数据在分区内的排列顺序。这两个键的组合成为主键。

即使在RDBS世界中,出于数据完整性的考虑,也可以避免更新PK。

但是在cassandra中,列族/表之间没有约束/关系。 为Pk字段(用户ID,已修改)分配完全相同的值将导致更新现有记录,否则将添加字段集。

参考: https://www.datastax.com/dev/blog/we-shall-have-order