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

bra*_*orm 485 database cql cassandra

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

primary key,
partition key, 
composite key 
clustering key
Run Code Online (Sandbox Code Playgroud)

Car*_*ini 1101

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

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

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

 create table stackoverflow_simple (
      key text PRIMARY KEY,
      data text      
  );
Run Code Online (Sandbox Code Playgroud)

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

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

 create table stackoverflow_composite (
      key_part_one text,
      key_part_two int,
      data text,
      PRIMARY KEY(key_part_one, key_part_two)      
  );
Run Code Online (Sandbox Code Playgroud)

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)      
  );
Run Code Online (Sandbox Code Playgroud)

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

  • 分区键是负责在您的节点的数据分发.
  • 集群主要负责数据的分区中的排序.
  • 主键相当于分区键在单场键表(即简单).
  • 复合/复合键就是任何多列键

进一步的使用信息:DATASTAX文件


小用法和内容示例
SIMPLE KEY:

insert into stackoverflow_simple (key, data) VALUES ('han', 'solo');
select * from stackoverflow_simple where key='han';
Run Code Online (Sandbox Code Playgroud)

表格内容

key | data
----+------
han | solo
Run Code Online (Sandbox Code Playgroud)

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';
Run Code Online (Sandbox Code Playgroud)

表格内容

 key_part_one | key_part_two | data
--------------+--------------+--------------------
      ronaldo |            9 |    football player
      ronaldo |           10 | ex-football player
Run Code Online (Sandbox Code Playgroud)

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

select * from stackoverflow_composite 
   where key_part_one = 'ronaldo' and key_part_two  = 10;
Run Code Online (Sandbox Code Playgroud)

查询输出

 key_part_one | key_part_two | data
--------------+--------------+--------------------
      ronaldo |           10 | ex-football player
Run Code Online (Sandbox Code Playgroud)

重要说明:分区键是使用a执行查询所需的最小说明符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的东西

希望这可以帮助.

  • 正如我写的那样 - <<一般"查询规则是你必须至少传递所有分区键列,然后你可以按照它们设置的顺序添加每个键." - 因为col10是在之前定义的col4你必须传递它以查询col4 (6认同)
  • 这让我困惑了几天,感谢这个答案,现在我能够在脑海中构建数据模型. (4认同)
  • 您可以添加二级索引,但这并不意味着您可以执行"任何"cql查询 - 以及更多:在创建二级索引之前,您应该计算到10 ... 000 ..... :) (2认同)
  • 辅助索引实现为本地索引 - 它们不在群集中分发.集群的每个节点负责存储其拥有的数据的二级索引.因此,对sec.index的查询可能涉及群集中的所有节点 (2认同)
  • 哇。您刚刚救了我几个小时或几天!谢谢您的精彩解释。 (2认同)

Sto*_*ica 111

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


Big*_*Guy 14

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

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

CREATE TABLE Cass (
    id int PRIMARY KEY,
    name text 
);
Run Code Online (Sandbox Code Playgroud)
Create Table Cass (
   id int,
   name text,
   PRIMARY KEY(id) 
);
Run Code Online (Sandbox Code Playgroud)

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

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

CREATE TABLE device_check (
  device_id   int,
  checked_at  timestamp,
  is_power    boolean,
  is_locked   boolean,
  PRIMARY KEY (device_id, checked_at)
);
Run Code Online (Sandbox Code Playgroud)

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

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

  • 你可以给你的消息来源(2013年=比你的帖子更早):http://thelastpickle.com/blog/2013/01/11/primary-keys-in-cql.html (5认同)

Cha*_*gde 8

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

复合主键:如上所述,聚类键在主键中是可选的.如果没有提到它们,它就是一个简单的主键.如果提到了聚类键,则它是复合主键.

复合分区键:仅使用一列作为分区键,可能会导致广泛的行问题(取决于用例/数据建模).因此,分区键有时被指定为多个列的组合.

关于哪一个是强制性的混淆,哪一个可以在查询中跳过等等,试图将 Cassandra想象成一个巨大的HashMap有帮助.因此,在HashMap中,如果没有Key,则无法检索值.
这里,分区键起到该的作用.因此每个查询都需要指定它们.没有它,Cassandra将不知道要搜索哪个节点.
集群键(列,哪些是可选的)有助于进一步缩小您的查询搜索卡桑德拉发现后出特定节点(和它的复制品),负责特定的分区键.


Sun*_*Sun 6

简而言之:

分区键是什么,但鉴定为一排,即识别大部分的时间是在单个列(称为主键)有时多个列的组合(称为复合分区键)。

集群键不过是Indexing & Sorting。集群键取决于几件事:

  1. 除了主键列之外,您在 where 子句中使用了哪些列。

  2. 如果您有非常大的记录,那么我可以将日期分开以便于管理。例如,我有一个县 100 万人口记录的数据。所以为了便于管理,我根据状态和密码等对数据进行聚类。

  • 分区键不是 A 行的标识...它标识了所有具有相同分区键的行 (3认同)