Cassandra中的Key有如下三種類型
- Primary Key
- Partitioning Key
- Clustering Key
Primary Key 主鍵
每張表都需要有主鍵。主鍵可以是一個(gè)字段或者多個(gè)字段的組合。每條記錄的主鍵必須唯一。舉個(gè)例子
CREATE TABLE player (
name text,
club text,
league text,
nationality text,
kit_number text,
position text,
goals int,
assists int,
appearences int,
PRIMARY KEY (club, league, name, kit_number, position, goals)
)
這個(gè)數(shù)據(jù)表的主鍵有多個(gè)字段,稱做復(fù)合主鍵。
分區(qū)鍵
Cassandra根據(jù)分區(qū)鍵,使用一致性哈希算法,把數(shù)據(jù)分配到集群的各個(gè)機(jī)器上。一個(gè)機(jī)器可以包含多個(gè)分區(qū)。Cassandra保證同一分區(qū)鍵的數(shù)據(jù)都在一臺機(jī)器上。通過合理的設(shè)置分區(qū)鍵,可以讓你的查詢讓盡量少的機(jī)器處理,提升查詢的效率
對于單主鍵字段來說,分區(qū)鍵和主鍵是同一個(gè)字段。
對于復(fù)合主鍵字段來說,默認(rèn)情況下,分區(qū)鍵是復(fù)合主鍵的第一個(gè)字段。如上例中,分區(qū)鍵是club字段
可以通過括號來將分區(qū)鍵指定為多個(gè)字段,如將上面CQL的11行修改為
PRIMARY KEY ((name, club), league, kit_number, position, goals)
Clustering Key
Clustering Keys決定了分區(qū)內(nèi)數(shù)據(jù)的排序。讓我們再看一下最初的例子
CREATE TABLE player (
name text,
club text,
league text,
nationality text,
kit_number text,
position text,
goals int,
assists int,
appearences int,
PRIMARY KEY (club, league, name, kit_number, position, goals)
)
在主鍵中的字段,除了分區(qū)鍵外都是clustering key。既然club是主鍵,那么league name kit_number position goals是Clustering key。你可以定義clustering key中每個(gè)字段的升降序??梢詫?code>kit_number降序、goals升序
排序順序與主鍵中字段的順序相同。因此,在上面的例子中,數(shù)據(jù)是按照如下布局的
- 所有相同
club的運(yùn)動(dòng)員都將分在同一個(gè)分區(qū) - 在分區(qū)內(nèi),按照
leauge排序 - 然后按照
name排序 - 然后按照
kit_number排序 - ...
定義不同字段升降序的語法如下(默認(rèn)為升序)
CREATE TABLE player (
name text,
club text,
league text,
nationality text,
kit_number text,
position text,
goals int,
assists int,
appearances int,
PRIMARY KEY (club, league, name, kit_number, position, goals)
)
WITH CLUSTERING ORDER BY (league ASC, name DESC, kit_number ASC, position DESC );