为了账号安全,请及时绑定邮箱和手机立即绑定

请问在Cassandra中,分区密钥、复合密钥和聚类密钥的区别是什么?

请问在Cassandra中,分区密钥、复合密钥和聚类密钥的区别是什么?

C++
慕尼黑5688855 2019-09-02 08:04:14
在Cassandra中,分区密钥、复合密钥和聚类密钥的区别是什么?我一直在网上阅读文章,以了解以下内容的不同之处key类型。但对我来说似乎很难理解。举例肯定有助于更好地理解。primary key, partition key,  composite key  clustering key
查看完整描述

3 回答

?
森林海

TA贡献2011条经验 获得超2个赞

在这方面有很多困惑,我会尽量让它变得简单。

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

主键可能是简约甚至宣称:

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

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

但是主键也可以是复合材料(又名复配),由更多列生成。

 create table stackoverflow_composite (
      key_part_one text,
      key_part_two int,
      data text,
      PRIMARY KEY(key_part_one, 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)      
  );

在这些名字后面.。

  • 这个

    分区键

    负责跨节点的数据分发。
  • 这个

    聚类键

    负责分区内的数据排序。
  • 这个

    主键

    等于

    分区键

    在单字段键表中(即

    简约).

  • 这个

    复合键/复合键

    是任何多列键。

进一步的使用情况:DataStax文档



小用法和内容示例
简约钥匙:


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

表内容

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

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

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列。要进行查询的“一般”规则是,您必须至少传递所有分区键列,然后可以按设置的顺序随意添加每个聚类键。

因此,有效的查询是(不包括次要指数)

  • 可乐1和可乐2
  • 可乐1、可乐2和可乐10
  • Col1,Col2,Col10和Col4

无效:

  • 可乐1、可乐2和COL 4
  • 不同时包含col1和col2的任何内容。

希望这能帮上忙。



查看完整回答
反对 回复 2019-09-04
?
阿波罗的战车

TA贡献1862条经验 获得超6个赞

添加一个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).



查看完整回答
反对 回复 2019-09-04
  • 3 回答
  • 0 关注
  • 280 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信