我一直在网上阅读文章,以了解以下关键类型之间的差异。但我似乎很难理解。举例肯定有助于更好地理解。
primary key,
partition key,
composite key
clustering key
我一直在网上阅读文章,以了解以下关键类型之间的差异。但我似乎很难理解。举例肯定有助于更好地理解。
primary key,
partition key,
composite key
clustering key
当前回答
值得注意的是,在关系世界(复合键)中,您可能会更多地使用这些类似的概念。
示例-假设您必须找到最近加入用户组x的最后N个用户,在这种情况下,如果读取占优势,您将如何有效地完成此工作?就像这样(来自Cassandra官方指南):
CREATE TABLE group_join_dates (
groupname text,
joined timeuuid,
join_date text,
username text,
email text,
age int,
PRIMARY KEY ((groupname, join_date), joined)
) WITH CLUSTERING ORDER BY (joined DESC)
Here, partitioning key is compound itself and the clustering key is a joined date. The reason why a clustering key is a join date is that results are already sorted (and stored, which makes lookups fast). But why do we use a compound key for partitioning key? Because we always want to read as few partitions as possible. How putting join_date in there helps? Now users from the same group and the same join date will reside in a single partition! This means we will always read as few partitions as possible (first start with the newest, then move to older and so on, rather than jumping between them).
事实上,在极端情况下,您还需要使用join_date的散列,而不是单独使用join_date—因此,如果您查询最近3天,通常这些散列共享相同的散列,因此可以从同一个分区使用!
其他回答
主键:像在许多数据库中一样,它是一个表中的唯一键,本质上它意味着,对于表中的任何两条记录,主键不能相同。数据库,在这种情况下,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查询,您将始终获得具有最大时间戳的记录。
复合键是指表的主键不是单列,而是多列。
主键是分区键和集群键的组合。
关于这一点有很多困惑,我会尽量让它简单一些。
主键是一个通用概念,用于指示用于从表中检索数据的一个或多个列。
主键可以是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的元素
简而言之:
分区键只是一行的标识,大多数情况下标识是单列(称为主键),有时是多列的组合(称为组合分区键)。
集群键只是索引和排序。集群键依赖于以下几点:
where子句中除了主键列外还使用哪些列。 如果你有非常大的记录,那么关于什么问题,我可以划分日期,以便于管理。例如,我有一个县100万的人口记录数据。因此,为了便于管理,我基于状态和pincode之后对数据进行了聚类。
在Cassandra中,主键、分区键、组合键、聚类键之间的区别总是让人困惑。所以,我将在下面解释并相互关联。我们使用CQL (Cassandra查询语言)来访问Cassandra数据库。 注:-答案是根据Cassandra的更新版本。
主键:- 在Cassandra中有2种不同的方法来使用主键。
CREATE TABLE Cass (
id int PRIMARY KEY,
name text
);
Create Table Cass (
id int,
name text,
PRIMARY KEY(id)
);
In CQL, the order in which columns are defined for the PRIMARY KEY matters. The first column of the key is called the partition key having property that all the rows sharing the same partition key (even across table in fact) are stored on the same physical node. Also, insertion/update/deletion on rows sharing the same partition key for a given table are performed atomically and in isolation. Note that it is possible to have a composite partition key, i.e. a partition key formed of multiple columns, using an extra set of parentheses to define which columns form the partition 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是cluster_key。
我们可以有多个集群键和分区键,这取决于声明。
主键:由分区键[和可选的集群键(或列)]组成 分区键:通过“分区键”的哈希值确定数据在集群中的具体节点
聚类键:用于对每个分区(或负责节点及其副本)中的数据进行排序。
复合主键:如上所述,聚类键在主键中是可选的。如果没有提到它们,它就是一个简单的主键。如果提到了集群键,则它是复合主键。
组合分区键:只使用一列作为分区键,可能会导致行宽问题(取决于用例/数据建模)。因此,分区键有时被指定为多个列的组合。
对于查询中哪些是强制的,哪些是可以跳过的等等,尝试将Cassandra想象成一个巨大的HashMap会有所帮助。在HashMap中,你不能在没有Key的情况下检索值。
在这里,分区键扮演该键的角色。因此,每个查询都需要指定它们。没有这个卡桑德拉就不知道该搜索哪个节点。
集群键(列,可选)有助于在Cassandra找到负责特定Partition键的特定节点(及其副本)后进一步缩小查询搜索范围。