我一直在阅读网上的文章,以了解以下 "钥匙 "类型之间的区别。但对我来说,这似乎很难掌握。例子肯定会有助于更好地理解。
primary key,
partition key,
composite key
clustering key
这方面有很多困惑,我将尽量使之简单化。
主键是一个一般的概念,表示一个或多个用于从表中检索数据的列。
主键可以是简单的,甚至可以是内联声明。
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)
);
在这些名字背后...
进一步的使用信息:DATASTAX DOCUMENTATION</a>。
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子句
执行查询所需的最小规格。
如果你有一个复合分区键,像下面这样
例如: PRIMARY KEY((col1, col2), col10, col4))
.
你只能通过传递至少col1和col2来执行查询,这两列是定义分区键的。进行查询的一般规则是,你必须至少传递所有的分区键列,然后你可以按照它们的顺序选择性地添加每个聚类键。
所以有效的查询是(不包括二级索引)。
无效。
希望这有帮助。
添加一个总结性的答案,因为接受的答案相当长。术语"行"和"列"是在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'。初级键((a, b), c, d)
:复合分区键是(a, b)
,复合聚类键是(c, d)
。CREATE TABLE Cass (
id int PRIMARY KEY,
name text
);
Create Table Cass (
id int,
name text,
PRIMARY KEY(id)
);
在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)
);
这里device_id是分区键,checked_at是集群键。
我们也可以有多个集群密钥和分区密钥,这取决于声明。