天天看点

Cassandra学习2 - Primary Key, Partition Key, and Clustering KeyPrimary KeyPartition KeyClustering Key和SELECT语句的关系

Cassandra学习2 - Primary Key, Partition Key, and Clustering Key

  • Primary Key
  • Partition Key
  • Clustering Key
  • 和SELECT语句的关系

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上面。

Cassandra学习2 - Primary Key, Partition Key, and Clustering KeyPrimary KeyPartition KeyClustering Key和SELECT语句的关系

比如哈希值是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表中的两组数据。

Cassandra学习2 - Primary Key, Partition Key, and Clustering KeyPrimary KeyPartition KeyClustering Key和SELECT语句的关系
Cassandra学习2 - Primary Key, Partition Key, and Clustering KeyPrimary KeyPartition KeyClustering Key和SELECT语句的关系
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 * FROM

WHERE col_1=? AND col_2=? AND col_3 AND col_4=? AND col_5;

这些在设计表的时候都必须考虑进去。

继续阅读