Cassandra学习2 - Primary Key, Partition Key, and Clustering Key
Primary Key
这个很容易理解。比如,我们新创建一个表,
CREATE TABLE IF NOT exists message (
id timeuuid,
creation_time timestamp,
recipient ascii,
content text,
PRIMARY KEY (id, creation_time)
) WITH CLUSTERING ORDER BY (creation_time DESC);
id和creation_time就是复合主键,Compound primary key。
在主键中的列又可分为partition key和clustering key。
Partition Key
理解partition key必须要了解Cassandra数据库的物理结构。Cassandra数据库是由很多个Node组成的Cluster。所有的数据都是分布在不同的Node上,只有partition key可以决定数据到底是存在哪一个Node上面。
Cassandra使用自身的HashFunction,把partition key作为参数来计算出一个Hash值。每个Node都有自己的Hash值范围,当一条记录所计算出的Hash值复合某个Node,那么这条数据就将保存在这个Node上面。
比如哈希值是17的记录被存储在node 2上。哈希值41的记录会被存储在node 5上面。
message表compound primary key中的第一列就是partition key。它只包含了一列。实际中partition key可以包含多个列,这种情况称为composite key。
例如,
CREATE TABLE IF NOT exists <TABLE> (
col_1 <data_type>,
col_2 <data_type>,
col_3 <data_type>,
col_4 <data_type>,
col_5 <data_type>,
PRIMARY KEY ((col_1,col_2,col_3),col_4,col_5)
) WITH CLUSTERING ORDER BY (col_4 DESC,col_5 ASC);
col_1,col_2,col_3,三个column是composite partition key。
Clustering Key
Clustering keys are responsible for sorting data within a partition. Each primary key column after the partition key is considered a clustering key.
Clustering key是给数据排序用的。在primary key中除了partition key外的所有key都是clustering key。
但是必须要注意的是,clustering key的排序只对同一个node上数据才起作用。
比较一下保存在message表中的两组数据。
Table message的partition key是id。A组数据使用不同的id,如果错误的理解了clustering key,你可能会误以为clustering key creation_time失效。B组数据使用完全相同的id,明显可以发现clustering key的作用。
和SELECT语句的关系
Cassandra不同于关系数据库,查询语句中的条件受primary key的限制。远远不如关系型数据库的查询自由。
比如,
- 如果有查询条件必须包括partition key。
- 查询条件中column的顺序必须和primary key中clustering key定义的顺序一致。比如,
SELECT * FROM
WHERE col_1=? AND col_2=? AND col_3 AND col_4=?;
或者
SELECT * FROMWHERE col_1=? AND col_2=? AND col_3 AND col_4=? AND col_5;
这些在设计表的时候都必须考虑进去。