我一直在网上阅读文章,以了解以下关键类型之间的差异。但我似乎很难理解。举例肯定有助于更好地理解。
primary key,
partition key,
composite key
clustering key
我一直在网上阅读文章,以了解以下关键类型之间的差异。但我似乎很难理解。举例肯定有助于更好地理解。
primary key,
partition key,
composite key
clustering key
当前回答
由于已接受的答案相当长,所以添加一个摘要答案。术语“行”和“列”是在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)。
其他回答
简而言之:
分区键只是一行的标识,大多数情况下标识是单列(称为主键),有时是多列的组合(称为组合分区键)。
集群键只是索引和排序。集群键依赖于以下几点:
where子句中除了主键列外还使用哪些列。 如果你有非常大的记录,那么关于什么问题,我可以划分日期,以便于管理。例如,我有一个县100万的人口记录数据。因此,为了便于管理,我基于状态和pincode之后对数据进行了聚类。
关于这一点有很多困惑,我会尽量让它简单一些。
主键是一个通用概念,用于指示用于从表中检索数据的一个或多个列。
主键可以是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主键的情况下,键的“第一部分”称为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文档
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来执行查询,这是定义分区键的两列。进行查询的“一般”规则是,您必须至少传递所有分区键列,然后您可以按照设置的顺序随意添加每个集群键。
因此,有效的查询是(不包括辅助索引)
Col1和col2 Col1 col2 col10 Col1 col2 col10 col4
无效:
Col1 col2 col4 任何不同时包含col1和col2的元素
主键:由分区键[和可选的集群键(或列)]组成 分区键:通过“分区键”的哈希值确定数据在集群中的具体节点
聚类键:用于对每个分区(或负责节点及其副本)中的数据进行排序。
复合主键:如上所述,聚类键在主键中是可选的。如果没有提到它们,它就是一个简单的主键。如果提到了集群键,则它是复合主键。
组合分区键:只使用一列作为分区键,可能会导致行宽问题(取决于用例/数据建模)。因此,分区键有时被指定为多个列的组合。
对于查询中哪些是强制的,哪些是可以跳过的等等,尝试将Cassandra想象成一个巨大的HashMap会有所帮助。在HashMap中,你不能在没有Key的情况下检索值。
在这里,分区键扮演该键的角色。因此,每个查询都需要指定它们。没有这个卡桑德拉就不知道该搜索哪个节点。
集群键(列,可选)有助于在Cassandra找到负责特定Partition键的特定节点(及其副本)后进一步缩小查询搜索范围。
由于已接受的答案相当长,所以添加一个摘要答案。术语“行”和“列”是在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)。
主键:像在许多数据库中一样,它是一个表中的唯一键,本质上它意味着,对于表中的任何两条记录,主键不能相同。数据库,在这种情况下,Cassandra的设计是为了确保这个条件在所有情况下都成立。因此,如果您尝试以PK1作为主键来编写记录,如果已经存在具有相同键PK1的记录,那么它将被覆盖,否则将创建一条新记录。
Partition Key: It is a construct of distributed databases(where data of a single table is divided into multiple parts called partitions). Partitions are then distributed across nodes using a distribution strategy(usually, hash of partition key) to get infinite scaling capabilities. Having said that, partition key is a set of columns of a record that decides which partition this record will belong to. And hence, partition key decides the physical location of a record across distributed cluster of nodes.
聚类键:聚类键决定特定分区中记录的顺序。因此,如果一个分区中有10K条记录,聚类键将决定这些10K以排序方式物理存储的顺序。
例子:
假设您在Cassandra中有一个表,用于存储电子商务网站的销售事件。
[order_id, item_id, quantity, amount, payment_id, status, order_time, PRIMARY KEY( (order_id, item_id), order_time)] with clustering ORDER BY (order_time DESC);
这里,
主键是((order_id, item_id), order_time),它将决定表中记录的唯一性。
分区键是(order_id, item_id),该元组的哈希值将决定该记录的分区和它在分布式集群上的位置。
Clustering Key是order_time,对于特定分区,记录将按照order_time降序排列。因此,如果您对特定分区执行Limit 1 cql查询,您将始终获得具有最大时间戳的记录。
复合键是指表的主键不是单列,而是多列。
主键是分区键和集群键的组合。