首页 文章

Cassandra中分区键,复合键和聚类键之间的区别?

提问于
浏览
420

我一直在阅读网络上的文章,以了解以下 key 类型之间的差异 . 但这对我来说似乎很难掌握 . 示例肯定有助于更好地理解 .

primary key,
partition key, 
composite key 
clustering key

7 回答

  • 0

    简而言之:

    Partition Key 对于一行来说只是 identification ,该标识大部分时间是单列(称为 Primary Key ),有时是多列的组合(称为 Composite Partition Key ) .

    Cluster key 只不过 IndexingSorting . 群集密钥取决于以下几点:

    • 在除主键列之外的where子句中使用哪些列 .

    • 如果您有非常大的记录,那么我可以分配日期以便于管理 . 例如,我有一百万个县人口记录的数据 . 因此,为了便于管理,我基于状态和PIN码后对数据进行聚类等 .

  • 972

    在数据库设计中,复合键是一组非最小的超级键 .

    复合键是一个包含复合键和至少一个不是超级键的属性的集合

    给定表:员工{employee_id,firstname,surname}

    可能的超级键是:

    {employee_id}
    {employee_id, firstname}
    {employee_id, firstname, surname}
    

    是唯一的最小超级密钥,它也是唯一的候选密钥 - 假设不保证唯一性 . 由于主键被定义为所选择的候选键,并且在该示例中仅存在一个候选键,因此是最小超级键,唯一候选键和唯一可能的主键 .

    复合键的详尽列表是:

    {employee_id, firstname}
    {employee_id, surname}
    {employee_id, firstname, surname}
    

    唯一的组合键是{employee_id,firstname,surname},因为该键包含复合键({employee_id,firstname})和不是超级键()的属性 .

  • 12

    围绕这个有很多困惑,我会尽量让它变得简单 .

    主键是一般概念,用于指示用于从表中检索数据的一个或多个列 .

    主键可以是 SIMPLE ,甚至可以内联声明:

    create table stackoverflow_simple (
          key text PRIMARY KEY,
          data text      
      );
    

    这意味着它是由一个列组成的 .

    但主键也可以是 COMPOSITE (又名 COMPOUND ),由更多列生成 .

    create table stackoverflow_composite (
          key_part_one text,
          key_part_two int,
          data text,
          PRIMARY KEY(key_part_one, key_part_two)      
      );
    

    COMPOSITE 主键的情况下,键的"first part"被称为 PARTITION KEY (在此示例中 key_part_one 是分区键),键的第二部分是 CLUSTERING KEY (在此示例中为 key_part_two

    Please note that the both partition and clustering key can be made by more columns ,这是如何:

    create table stackoverflow_multiple (
          k_part_one text,
          k_part_two int,
          k_clust_one text,
          k_clust_two int,
          k_clust_three uuid,
          data text,
          PRIMARY KEY((k_part_one, k_part_two), k_clust_one, k_clust_two, k_clust_three)      
      );
    

    这些名字背后......

    • Partition Key 负责跨节点的数据分发 .

    • Clustering Key 负责分区内的数据排序 .

    • Primary Key 等同于单字段密钥表中的 Partition Key (即 Simple ) .

    • Composite/Compound Key 只是任何多列键

    更多使用信息:DATASTAX DOCUMENTATION


    小用法和内容示例
    SIMPLE KEY:

    insert into stackoverflow_simple (key, data) VALUES ('han', 'solo');
    select * from stackoverflow_simple where key='han';
    

    table content

    key | data
    ----+------
    han | solo
    

    COMPOSITE/COMPOUND KEY 可以检索"wide rows"(即即使您已定义了聚类键,也可以只通过分区键进行查询)

    insert into stackoverflow_composite (key_part_one, key_part_two, data) VALUES ('ronaldo', 9, 'football player');
    insert into stackoverflow_composite (key_part_one, key_part_two, data) VALUES ('ronaldo', 10, 'ex-football player');
    select * from stackoverflow_composite where key_part_one = 'ronaldo';
    

    table content

    key_part_one | key_part_two | data
    --------------+--------------+--------------------
          ronaldo |            9 |    football player
          ronaldo |           10 | ex-football player
    

    但您可以使用所有密钥(分区和群集)查询...

    select * from stackoverflow_composite 
       where key_part_one = 'ronaldo' and key_part_two  = 10;
    

    query output

    key_part_one | key_part_two | data
    --------------+--------------+--------------------
          ronaldo |           10 | ex-football player
    

    重要说明:分区键是使用 where clause 执行查询所需的最小说明符 . 如果您有复合分区键,如下所示

    例如: PRIMARY KEY((col1, col2), col10, col4))

    您只能通过至少传递col1和col2来执行查询,这些是定义分区键的2列 . 要进行查询的“常规”规则是您必须至少传递所有分区键列,然后您可以按照它们设置的顺序可选地添加每个群集键 .

    所以有效的查询是( excluding secondary indexes

    • col1和col2

    • col1和col2和col10

    • col1和col2以及col10和col 4

    无效:

    • col1和col2和col4

    • 任何不包含col1和col2的东西

    希望这可以帮助 .

  • 3

    Primary Key :由分区键[和可选的聚类键(或列)组成]
    Partition Key :分区键的哈希值用于确定群集中用于存储数据的特定节点
    Clustering Key :用于对每个分区(或负责节点及其副本)中的数据进行排序

    Compound Primary Key :如上所述,群集密钥在主密钥中是可选的 . 如果他们不是一个简单的主键 . 如果提到了聚类键,则它是复合主键 .

    Composite Partition Key :仅使用一列作为分区键,可能会导致 wide row issues (取决于用例/数据建模) . 因此,分区键有时被指定为多个列的组合 .

    Regarding confusion of which one is mandatory ,在查询中可以跳过哪一个,尝试 imagine Cassandra as a giant HashMap 帮助 . 因此,在HashMap中,如果没有Key,则无法检索值 .
    在这里, Partition keys 扮演那个角色的角色 . 因此每个查询都需要指定它们 . 没有它,Cassandra将不知道要搜索哪个节点 .
    clustering keys (列,可选)有助于进一步提高在Cassandra发现负责该特定 Partition key 的特定节点(以及它的副本)之后缩小查询搜索范围 .

  • 7

    添加redux答案作为可接受的答案是很长的 . 术语“行”和“列”在CQL的上下文中使用,而不是如何实际实现Cassandra .

    • 主键唯一标识一行 .

    • 复合键是由多列组成的键 .

    • 分区键是查找一组行(即分区)的主查找 .

    • 聚类键是主键的一部分,它不是分区键(并定义了分区内的顺序) .

    例子:

    • PRIMARY KEY (a) :分区键是 a .

    • PRIMARY KEY (a, b) :分区键为 a ,群集键为 b .

    • PRIMARY KEY ((a, b)) :复合分区键为 (a, b) .

    • PRIMARY KEY (a, b, c) :分区键为 a ,复合群集键为 (b, c) .

    • PRIMARY KEY ((a, b), c) :复合分区键为 (a, b) ,聚类键为 c .

    • PRIMARY KEY ((a, b), c, d) :复合分区键为 (a, b) ,复合聚类键为 (c, d) .

  • 87

    在cassandra中,主键,分区键,复合键,聚类键之间的区别总是会产生一些混乱 . 所以我将在下面解释并与其他人联系起来 . 我们使用CQL(Cassandra查询语言)进行Cassandra数据库访问 . 注意: - 答案是根据Cassandra的更新版本 . Primary Key :-

    在cassandra中有两种不同的方式来使用主键 .

    CREATE TABLE Cass (
        id int PRIMARY KEY,
        name text 
    );
    

    Create Table Cass (
       id int,
       name text,
       PRIMARY KEY(id) 
    );
    

    在CQL中,为PRIMARY KEY定义列的顺序很重要 . 密钥的第一列称为分区密钥,其具有共享相同分区密钥(实际上甚至跨表)的所有行存储在同一物理节点上的属性 . 此外,对于给定表共享相同分区键的行上的插入/更新/删除是以原子方式单独执行的 . 注意,可以具有复合分区键,即由多列形成的分区键,使用额外的括号组来定义哪些列形成分区键 .

    Partitioning and Clustering PRIMARY KEY定义由两部分组成:分区键和聚类列 . 第一部分映射到存储引擎行键,而第二部分用于对一行中的列进行分组 .

    CREATE TABLE device_check (
      device_id   int,
      checked_at  timestamp,
      is_power    boolean,
      is_locked   boolean,
      PRIMARY KEY (device_id, checked_at)
    );
    

    这里device_id是分区键,checked_at是cluster_key .

    我们可以有多个集群密钥以及依赖于声明的分区密钥 .

  • -3

    值得注意的是,在关系世界(复合键)中,你可能会使用那些更多的类似概念 .

    示例 - 假设您必须找到最近加入用户组X的最后N个用户 . 在这种情况下,如果读取占主导地位,您将如何有效地执行此操作?像那样(来自官方Cassandra guide):

    CREATE TABLE group_join_dates (
        groupname text,
        joined timeuuid,
        join_date text,
        username text,
        email text,
        age int,
        PRIMARY KEY ((groupname, join_date), joined)
    ) WITH CLUSTERING ORDER BY (joined DESC)
    

    这里, partitioning key 本身就是复合而 clustering key 是一个连接日期 . clustering key 是连接日期的原因是结果已经 sorted (并存储,这使得查找速度很快) . 但为什么我们使用复合键 partitioning key ?因为 we always want to read as few partitions as possible . 如何将 join_date 放在那里有帮助?现在来自同一组和相同加入日期的用户将驻留在一个分区中!这意味着我们将始终尽可能少地读取分区(首先从最新的分区开始,然后转到较旧的分区,依此类推,而不是在它们之间跳转) .

    实际上,在极端情况下,您还需要使用join_date的哈希而不是join_date - 这样如果您查询最近3天,那么它们通常会共享相同的哈希,因此可以从同一个分区获得!

相关问题