【问题标题】:Can the first key of partition key be a clustering key?分区键的第一个键可以是集群键吗?
【发布时间】:2021-07-06 19:52:55
【问题描述】:

在 Cassandra 数据库中使用以下架构:

CREATE TABLE IF NOT EXISTS  stackoverflow_sorted_by_key_part_two (
      key_part_one      UUID,
      key_part_two      UUID,
      idempotence_key   int,
      data              TEXT,
      PRIMARY KEY((key_part_one, idempotence_key), key_part_two)      
);

(key_part_one, idempotence_key) 是一个分区键 & key_part_two 是聚类键。

使用上述模式,记录按key_part_two 升序排序(作为表索引的一部分)


但是,为了更快的选择查询(使用WHERE key_part_one == "some_uuid"),我们希望记录按key_part_one 排序(作为表索引的一部分)。

以下架构是否增强了选择查询性能?

CREATE TABLE IF NOT EXISTS  stackoverflow_sorted_by_key_part_one (
      key_part_one      UUID,
      key_part_two      UUID,
      idempotence_key   int,
      data              TEXT,
      PRIMARY KEY((key_part_one, idempotence_key), key_part_two)      
)WITH CLUSTERING ORDER BY (key_part_one ASC);

【问题讨论】:

    标签: sql database cassandra cql


    【解决方案1】:

    不,您不能这样做 - 您只能在 WITH CLUSTERING ORDER BY 中指定聚类列。如果列是分区键的一部分,则它不可排序 - Cassandra 将散列函数应用于该列的值(或列,如果它是复合键),并使用该散列(令牌)来查找负责该令牌的节点。然后按聚类列排序仅发生在分区内。

    附:浏览 freely available from DataStax site 的“Cassandra:权威指南,第 3 版”一书的第一章 - 它会帮助您进行 Cassandra 的数据建模。

    【讨论】:

    • 还有一个问题:对于只有 3 列的表(key_part_onekey_part_twodata),集群列为WITH CLUSTERING ORDER BY (key_part_one ASC).......我们需要提到语法为PRIMARY KEY(key_part_two, key_part_one) ,其中key_part_two 成为分区键
    • 是的,如果您至少通过key_part_two搜索...
    • 对于一列 (some_maintenance_id) 和 PRIMARY KEY(some_maintenance_id) 的表。我们可以将some_maintenance_id 称为分区键和集群键吗?
    • 不,您不能将同一列用作分区键和集群列。但是您可以创建第二列,该列将填充与第一列相同的内容。
    • 或者更确切地说,我们不需要聚类列,因为它是一列。因为我们不需要这样的排序,只需要 hashing(column value) 就足够了
    猜你喜欢
    • 2011-10-12
    • 2019-09-07
    • 1970-01-01
    • 2014-09-16
    • 2018-11-12
    • 2018-03-02
    • 1970-01-01
    • 1970-01-01
    • 2014-03-28
    相关资源
    最近更新 更多