小编典典

Cassandra中分区键,复合键和集群键之间的区别?

all

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

primary key,
partition key, 
composite key 
clustering key

阅读 160

收藏
2022-03-06

共1个答案

小编典典

对此有很多困惑,我将尝试使其尽可能简单。

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

主键可能很 _ 简单_ ,甚至可以内联声明:

 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 主键的情况下,键的“第一部分”称为 _ PARTITION KEY (在本例中
key_part_one 是分区键),键的第二部分是CLUSTERING KEY (在本例中 key_part_two

请注意,分区键和集群键都可以由更多列组成 ,方法如下:

 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)      
  );

这些名字的背后…

  • 分区键 负责跨节点分发数据。
  • Clustering Key 负责分区内的数据排序。
  • 相当于单字段键表中的 分区键(即 Simple )。
  • 复合/复合键 只是任何多列键

更多使用信息:DATASTAX
文档


小用法和内容示例
简单 KEY:

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

表格内容

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

COMPOSITE/COMPOUND KEY 可以检索“宽行”(即您可以仅通过分区键查询,即使您定义了集群键)

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';

表格内容

 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;

查询输出

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

重要说明:分区键是使用where clause. 如果您有复合分区键,如下所示

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

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

所以,有效的查询是( 不包括二级索引

  • col1 和 col2
  • col1 和 col2 和 col10
  • col1 和 col2 和 col10 和 col 4

无效的:

  • col1 和 col2 和 col4
  • 不包含 col1 和 col2 的任何内容
2022-03-06