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上面。
比如哈希值是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 * FROM
WHERE col_1=? AND col_2=? AND col_3 AND col_4=? AND col_5;
這些在設計表的時候都必須考慮進去。