天天看點

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;

這些在設計表的時候都必須考慮進去。

繼續閱讀