【问题标题】:Cassandra CLUSTERING ORDER with updates [performance]带有更新的 Cassandra 集群订单 [性能]
【发布时间】:2019-11-13 05:15:44
【问题描述】:

使用 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 (modified DESC)”被删除,这个表的性能会更好吗?

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

【问题讨论】:

  • 提示:该表定义不是有效的 CQL。
  • 我把它和cassandra.apache.org/doc/latest/cql/ddl.html#create-table这里的表定义进行了比较,似乎是有效的,请您指出问题
  • 问题是modified没有被定义为聚类键,所以你不能在它上面定义聚类顺序。要解决此问题,应将主键定义为PRIMARY KEY (user_id, modified)。有关组合键的更多信息,以及集群键的特征stackoverflow.com/questions/24949676/…
  • 我的错误是疏忽,我将日期作为服务器上的主键,只是在我的示例中没有。
  • 另请注意,如果您想通过modified 设置聚类顺序,您将无法更新该记录(如stackoverflow.com/questions/27075596/… 中所述); Cassandra 是一个仅追加的数据库引擎:这意味着对记录的任何更新都将添加具有不同时间戳的新记录,选择将考虑具有最新时间戳的记录。这意味着永远不会有 “重新排序” 操作。

标签: cassandra cassandra-3.0


【解决方案1】:

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

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

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

【讨论】:

  • 知道了,听起来我原来的问题不再适用,因为正如你提到的,它首先按 user_id 排序,而且我打算只为每个 user_id 存储一条记录。
【解决方案2】:

移动评论作为答案,作为更新问题的回复:

如果要对“修改”列进行更新,它是否会添加 服务器上“重新订购”的额外开销是开销与 查询性能显着?

如果modified 被定义为集群键的一部分,您将无法使用to update that record,但您可以根据需要添加任意数量的记录,每次都具有不同的修改日期。

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

删除或创建聚类顺序应该在如何检索信息的查询的基础上定义,如果您只使用该 user_id 的最新记录,那么按照您定义的聚类顺序是有意义的它。

【讨论】:

    【解决方案3】:

    在您的数据模型中,user_id 是对数据局部性很重要的行键/分片键/分区键 (userid),而集群列(已修改)指定数据在分区内的排列顺序。这两个键的组合构成主键。

    即使在 RDBS 世界中,为了数据完整性,更新 PK 也是可以避免的。

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

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

    【讨论】:

      猜你喜欢
      • 2017-02-10
      • 2015-05-23
      • 1970-01-01
      • 2021-09-02
      • 1970-01-01
      • 2017-04-22
      • 1970-01-01
      • 2012-05-02
      • 1970-01-01
      相关资源
      最近更新 更多