Cassandra 文件

版本

您正在檢視預發行版本的說明文件。

資料定義

CQL 將資料儲存在表格中,其結構定義表格中資料的配置。表格位於鍵空間中。鍵空間定義套用到所有鍵空間表格的選項。複製策略 是重要的鍵空間選項,複製因子也是如此。一個良好的通用規則是每個應用程式一個鍵空間。叢集通常只為一個活動應用程式定義一個鍵空間。

本節描述用於建立、修改和移除那些鍵空間和表格的陳述。

常見定義

鍵空間和表格的名稱由下列語法定義

keyspace_name::= name
table_name::= [keyspace_name '.' ] name
name::= unquoted_name | quoted_name
unquoted_name::= re('[a-zA-Z_0-9]\{1, 48}')
quoted_name::= '"' unquoted_name '"'

鍵空間和表格名稱都應僅包含字母數字字元,不得為空,且長度限制為 48 個字元(此限制主要在於避免檔案名稱(可能包含鍵空間和表格名稱)超過某些檔案系統的限制)。預設情況下,鍵空間和表格名稱不區分大小寫(myTable 等於 mytable),但可以使用雙引號強制區分大小寫("myTable" 不同於 mytable)。

此外,表格總是鍵空間的一部分,而表格名稱可以透過其所屬的鍵空間來提供完全限定。如果未完全限定,則假設表格位於目前鍵空間中(請參閱 USE 陳述)。

此外,有效欄位名稱定義如下

column_name::= identifier

我們還定義了陳述選項的概念,供下列各節使用

options::= option ( AND option )*
option::= identifier '=' ( identifier
	| constant
	| map_literal )

建立鍵空間

使用 CREATE KEYSPACE 陳述式建立鍵空間

create_keyspace_statement::= CREATE KEYSPACE [ IF NOT EXISTS ] keyspace_name
	WITH options

例如

CREATE KEYSPACE excelsior
   WITH replication = {'class': 'SimpleStrategy', 'replication_factor' : 3};

CREATE KEYSPACE excalibur
   WITH replication = {'class': 'NetworkTopologyStrategy', 'DC1' : 1, 'DC2' : 3}
   AND durable_writes = false;

嘗試建立已存在的鍵空間會傳回錯誤,除非使用 IF NOT EXISTS 選項。如果使用此選項,如果鍵空間已存在,則陳述式將為 no-op。

支援的 options 如下

名稱 種類 強制性 預設值 說明

複製

映射

不適用

要使用的鍵空間複製策略和選項(請參閱以下詳細資料)。

durable_writes

簡單

true

是否對此鍵空間的更新使用提交記錄(自行承擔停用此選項的風險!)。

replication 屬性為強制性,且必須包含定義所需 複製策略類別的 'class' 子選項。其餘子選項取決於使用的複製策略。預設情況下,Cassandra 支援下列 'class'

SimpleStrategy

定義將資料散佈到整個叢集的複製因子的簡單策略。這通常不是製作環境的明智選擇,因為它不尊重資料中心配置,且可能導致查詢延遲大幅度變化。對於製作環境,請使用 NetworkTopologyStrategySimpleStrategy 支援單一強制性引數

子選項 類型 說明

'replication_factor'

int

全部

每個範圍儲存的複製品數量

NetworkTopologyStrategy

為每個資料中心獨立設定複製因子的製作環境複製策略。其餘子選項為鍵值對,其中鍵設定為資料中心名稱,其值設定為關聯的複製因子。選項

子選項 類型 說明 '<datacenter>'

int

在提供的資料中心中每個範圍儲存的複製品數量。

'replication_factor'

int

在稍後變更鍵空間和變更 replication_factor 時,自動擴充只會新增新的資料中心以確保安全,它不會變更現有的資料中心或移除任何資料中心,即使它們不再在叢集中。如果您想在設定 replication_factor 時移除資料中心,請明確將您想要有零個複本的資料中心設定為零。

自動擴充資料中心的範例,有兩個資料中心:DC1DC2

CREATE KEYSPACE excalibur
    WITH replication = {'class': 'NetworkTopologyStrategy', 'replication_factor' : 3};

DESCRIBE KEYSPACE excalibur;

將會產生

CREATE KEYSPACE excalibur WITH replication = {'class': 'NetworkTopologyStrategy', 'DC1': '3', 'DC2': '3'} AND durable_writes = true;

自動擴充和覆寫資料中心的範例

CREATE KEYSPACE excalibur
   WITH replication = {'class': 'NetworkTopologyStrategy', 'replication_factor' : 3, 'DC2': 2};

DESCRIBE KEYSPACE excalibur;

將會產生

CREATE KEYSPACE excalibur WITH replication = {'class': 'NetworkTopologyStrategy', 'DC1': '3', 'DC2': '2'} AND durable_writes = true;

使用 replication_factor 時排除資料中心的範例

CREATE KEYSPACE excalibur
   WITH replication = {'class': 'NetworkTopologyStrategy', 'replication_factor' : 3, 'DC2': 0};

DESCRIBE KEYSPACE excalibur;

將會產生

CREATE KEYSPACE excalibur WITH replication = {'class': 'NetworkTopologyStrategy', 'DC1': '3'} AND durable_writes = true;

如果已啟用 暫時性複本,則可以透過定義格式為 '<total_replicas>/<transient_replicas>' 的複本係數,為 SimpleStrategyNetworkTopologyStrategy 設定暫時性複本

例如,這個鍵空間在 DC1 中會有 3 個複本,其中 1 個是暫時性的,在 DC2 中會有 5 個複本,其中 2 個是暫時性的

CREATE KEYSPACE some_keyspace
   WITH replication = {'class': 'NetworkTopologyStrategy', 'DC1' : '3/1'', 'DC2' : '5/2'};

USE

USE 陳述式會將目前的鍵空間變更為指定的鍵空間。CQL 中的許多物件都繫結到鍵空間(資料表、使用者定義類型、函數等),而目前的鍵空間是在查詢中不帶完全限定名稱(不帶前置鍵空間名稱)參照這些物件時使用的預設鍵空間。USE 陳述式指定要使用的鍵空間作為引數

use_statement::= USE keyspace_name

使用 CQL

USE excelsior;

ALTER KEYSPACE

ALTER KEYSPACE 陳述式會修改鍵空間的選項

alter_keyspace_statement::= ALTER KEYSPACE [ IF EXISTS ] keyspace_name
	WITH options

例如

ALTER KEYSPACE excelsior
    WITH replication = {'class': 'SimpleStrategy', 'replication_factor' : 4};

如果鍵空間不存在,陳述式會傳回錯誤,除非使用了 IF EXISTS,這種情況下作業會是空作業。支援的選項與 建立鍵空間 的選項相同。

DROP KEYSPACE

使用 DROP KEYSPACE 陳述式刪除鍵空間

drop_keyspace_statement::= DROP KEYSPACE [ IF EXISTS ] keyspace_name

例如

DROP KEYSPACE excelsior;

刪除鍵空間會立即且不可逆地移除該鍵空間,包括所有資料表、使用者定義類型、使用者定義函數,以及這些資料表中包含的所有資料。

如果鍵空間不存在,陳述式將傳回錯誤,除非使用 IF EXISTS,這種情況下操作為無操作。

建立資料表

建立新資料表使用 CREATE TABLE 陳述式

create_table_statement::= CREATE TABLE [ IF NOT EXISTS ] table_name '('
	column_definition  ( ',' column_definition )*
	[ ',' PRIMARY KEY '(' primary_key ')' ]
	 ')' [ WITH table_options ]
column_definition::= column_name cql_type [ STATIC ] [ column_mask ] [ PRIMARY KEY]
column_mask::= MASKED WITH ( DEFAULT | function_name '(' term ( ',' term )* ')' )
primary_key::= partition_key [ ',' clustering_columns ]
partition_key::= column_name  | '(' column_name ( ',' column_name )* ')'
clustering_columns::= column_name ( ',' column_name )*
table_options::= COMPACT STORAGE [ AND table_options ]
	| CLUSTERING ORDER BY '(' clustering_order ')'
	[ AND table_options ]  | options
clustering_order::= column_name (ASC | DESC) ( ',' column_name (ASC | DESC) )*

例如,以下是建立資料表的 CQL 陳述式

CREATE TABLE monkey_species (
    species text PRIMARY KEY,
    common_name text,
    population varint,
    average_size int
) WITH comment='Important biological records';

CREATE TABLE timeline (
    userid uuid,
    posted_month int,
    posted_time uuid,
    body text,
    posted_by text,
    PRIMARY KEY (userid, posted_month, posted_time)
) WITH compaction = { 'class' : 'LeveledCompactionStrategy' };

CREATE TABLE loads (
    machine inet,
    cpu int,
    mtime timeuuid,
    load float,
    PRIMARY KEY ((machine, cpu), mtime)
) WITH CLUSTERING ORDER BY (mtime DESC);

CQL 資料表有一個名稱,並由一組組成。建立資料表等於定義每個列將具有的 欄位,哪些欄位組成 主鍵,以及定義資料表的 選項

嘗試建立已存在的資料表將傳回錯誤,除非使用 IF NOT EXISTS 指令。如果使用,如果資料表已存在,陳述式將為無操作。

欄位定義

CQL 資料表中的每一列都將具有在資料表建立時定義的預定義欄位。稍後可以使用 變更陳述式新增欄位。

column_definition 包含欄位名稱及其 類型,限制該欄位接受的值。此外,欄位定義可以具有下列修改項

  • STATIC:宣告欄位為 靜態欄位

  • PRIMARY KEY:宣告欄位為資料表 主鍵 的唯一組成部分

靜態欄位

在資料表定義中,有些欄位可以宣告為 STATIC。靜態欄位將由屬於同一分割區(具有相同的 分割區金鑰)的所有列「共用」。

例如

  • 程式碼

  • 結果

CREATE TABLE t (
    pk int,
    t int,
    v text,
    s text static,
    PRIMARY KEY (pk, t)
);
INSERT INTO t (pk, t, v, s) VALUES (0, 0, 'val0', 'static0');
INSERT INTO t (pk, t, v, s) VALUES (0, 1, 'val1', 'static1');
SELECT * FROM t;
   pk | t | v      | s
  ----+---+--------+-----------
   0  | 0 | 'val0' | 'static1'
   0  | 1 | 'val1' | 'static1'

正如您所見,分割區中兩列的 s 值相同(static1)(分割區金鑰為 pk,且兩列位於同一個分割區):第二次插入會覆寫 s 的值。

使用靜態欄位有下列限制

  • 沒有分群欄位的資料表不能有靜態欄位。在沒有分群欄位的資料表中,每個分割區只有一個列,因此每個欄位本質上都是靜態的)

  • 只有非主鍵欄位可以是靜態的。

主鍵

在表格中,一列由其 PRIMARY KEY 唯一識別,因此所有表格必須定義一個 PRIMARY KEY。PRIMARY KEY 由表格中一個或多個已定義的欄位組成。在語法上,主鍵定義為字詞 PRIMARY KEY 後接括弧中的欄位名稱清單,各欄位名稱以逗號分隔。如果主鍵只有一個欄位,您也可以在表格定義中將 PRIMARY KEY 字詞新增至該欄位。主鍵定義中欄位的順序定義了分區鍵和叢集欄位。

CQL 主鍵由兩部分組成

分區鍵
  • 它是主鍵定義的第一個組成部分。它可以是單一欄位,或使用額外的括弧組,可以是多個欄位。表格必須至少有一個分區鍵,最小的表格定義為

    CREATE TABLE t (k text PRIMARY KEY);
叢集欄位
  • 這些欄位是主鍵定義中分區鍵之後的欄位。這些欄位的順序定義了叢集順序

以下是主鍵定義的一些範例

  • PRIMARY KEY (a)a 是單一分區鍵,沒有叢集欄位

  • PRIMARY KEY (a, b, c)a 是單一分區鍵,bc 是叢集欄位

  • PRIMARY KEY ((a, b), c)ab 組成複合分區鍵,c 是叢集欄位

如上所述,主鍵唯一識別表格中的列。此唯一性的結果是,如果使用相同主鍵插入另一列,則會發生 UPSERT,並取代具有相同主鍵的現有列。不屬於主鍵一部分的欄位無法定義唯一性。

分區鍵

在表格中,CQL 定義了分區的概念,用於定義資料在 Cassandra 集群中的位置。分區是一組列,它們的分區鍵值相同。

請注意,如果分區鍵由多個欄位組成,則當列在所有這些分區鍵欄位中具有相同值時,這些列屬於同一個分區。從分區鍵欄位計算雜湊,而該雜湊值定義分區位置。因此,例如,根據下列表格定義和內容

CREATE TABLE t (
    a int,
    b int,
    c int,
    d int,
    PRIMARY KEY ((a, b), c, d)
);
INSERT INTO t (a, b, c, d) VALUES (0,0,0,0);
INSERT INTO t (a, b, c, d) VALUES (0,0,1,1);
INSERT INTO t (a, b, c, d) VALUES (0,1,2,2);
INSERT INTO t (a, b, c, d) VALUES (0,1,3,3);
INSERT INTO t (a, b, c, d) VALUES (1,1,4,4);
SELECT * FROM t;

將會產生

 a | b | c | d
---+---+---+---
 0 | 0 | 0 | 0 	(1)
 0 | 0 | 1 | 1
 0 | 1 | 2 | 2	(2)
 0 | 1 | 3 | 3
 1 | 1 | 4 | 4  (3)

(5 rows)
1 列 1 和 2 在同一個分區中,因為欄位 ab 都是零。
2 列 3 和 4 在同一個分區中,但不同於列 1 和 2,因為在兩列中,欄位 a 為零,欄位 b 為 1。
3 列 5 本身在第三個分區中,因為欄位 ab 都是 1。

請注意,資料表永遠都有分割鍵,如果資料表沒有群集欄位,則該資料表的每個分割區都只有一列,因為分割鍵(複合或其他)會識別單一位置。

分割區最重要的特性是,屬於同一個分割區的所有列都保證會儲存在同一組複製品節點上。換句話說,資料表的分割鍵會定義哪些列會集中在叢集中的同一個節點上。資料的集中化對於資料的有效擷取非常重要,這需要 Cassandra 協調器盡可能連繫較少的節點。不過,這個保證也有反面,所有共用分割鍵的列都會儲存在同一個節點上,這會造成讀取和寫入的熱點。雖然選取會將資料表列分組的主鍵有助於批次更新,並能確保更新是原子性的且以隔離方式進行,但分割區的規模必須「剛剛好,不能太大也不能太小」。

考慮查詢模式並根據查詢指派主鍵的資料建模,會讓資料擷取的延遲時間最低。

群集欄位

資料表的群集欄位會定義該資料表分割區的群集順序。對於指定的分割區,所有列都會依據該群集順序排序。群集欄位也會為資料表中的列新增唯一性。

例如,給定

CREATE TABLE t2 (
    a int,
    b int,
    c int,
    d int,
    PRIMARY KEY (a, b, c)
);
INSERT INTO t2 (a, b, c, d) VALUES (0,0,0,0);
INSERT INTO t2 (a, b, c, d) VALUES (0,0,1,1);
INSERT INTO t2 (a, b, c, d) VALUES (0,1,2,2);
INSERT INTO t2 (a, b, c, d) VALUES (0,1,3,3);
INSERT INTO t2 (a, b, c, d) VALUES (1,1,4,4);
SELECT * FROM t2;

將會產生

 a | b | c | d
---+---+---+---
 1 | 1 | 4 | 4	(1)
 0 | 0 | 0 | 0
 0 | 0 | 1 | 1
 0 | 1 | 2 | 2
 0 | 1 | 3 | 3

(5 rows)
1 列 1 在一個分割區中,而列 2-5 在另一個分割區中。顯示順序也不同。

更仔細地檢視同一個分割區中的四列,b 群集欄位會定義這些列顯示的順序。資料表的分割鍵會將列分組在同一個節點上,而群集欄位則會控制這些列在節點上的儲存方式。

這種排序允許在分割區中非常有效率地擷取資料範圍

SELECT * FROM t2 WHERE a = 0 AND b > 0 and b <= 3;

將會產生

 a | b | c | d
---+---+---+---
 0 | 1 | 2 | 2
 0 | 1 | 3 | 3

(2 rows)

資料表選項

CQL 資料表有許多選項可以在建立時設定(而且大部分選項可以在之後變更)。這些選項會在WITH 關鍵字之後指定。

一個重要的選項是CLUSTERING ORDER BY,它無法在建立後變更,會影響針對資料表執行的查詢方式。值得在此更詳細地討論。

群集順序

資料表的群集順序是由群集欄位定義的。預設群集順序是群集欄位資料類型的遞增順序。例如,整數會從 1、2、…​ n 排序,而文字會從 A 到 Z 排序。

CLUSTERING ORDER BY 表格選項使用由逗號分隔的群集欄位清單,每個欄位設定為 ASC(用於遞增順序)或 DESC(用於遞減順序)。如果未設定 CLUSTERING ORDER BY 選項,則所有群集欄位的預設值為遞增。

此選項基本上是儲存引擎的提示,用於變更儲存列的順序。請注意設定此選項的後果

  • 當使用不含 ORDER BY 子句的 SELECT 陳述式查詢時,會變更結果的預設遞增順序。

  • 它限制在該表格上的 SELECT 陳述式中如何使用 ORDER BY 子句。結果只能使用原始群集順序或反向群集順序排序。假設您建立一個包含兩個群集欄位 ab 的表格,定義為 WITH CLUSTERING ORDER BY (a DESC, b ASC)。表格上的查詢可以使用 ORDER BY (a DESC, b ASC)ORDER BY (a ASC, b DESC)。混合順序,例如 ORDER BY (a ASC, b ASC)ORDER BY (a DESC, b DESC),不會傳回預期的順序。

  • 它對查詢有效能影響。反向群集順序的查詢比預設遞增順序慢。如果您計畫主要以遞減順序查詢,請使用 WITH CLUSTERING ORDER BY () 在表格架構中宣告群集順序。此最佳化通常用於時間序列,以從最新到最舊擷取資料。

其他表格選項

表格支援下列選項

選項 種類 預設值 說明

註解

簡單

自由格式、人類可讀的註解

speculative_retry

簡單

99PERCENTILE

推測重試選項

cdc

布林值

false

在表格上建立變更資料擷取 (CDC) 記錄

additional_write_policy

簡單

99PERCENTILE

speculative_retry 相同

gc_grace_seconds

簡單

864000

垃圾回收墓碑(刪除標記)前要等待的時間

bloom_filter_fp_chance

簡單

0.00075

sstable 布林過濾器的假陽性目標機率。所述布林過濾器的大小將調整為提供指定的機率,因此降低此值會影響布林過濾器在記憶體和磁碟中的大小。

default_time_to_live

簡單

0

表格的預設過期時間(「TTL」),單位為秒

compaction

映射

請參閱下方

壓縮選項

壓縮

映射

請參閱下方

壓縮選項

快取

映射

請參閱下方

快取選項

memtable_flush_period_in_ms

簡單

0

Cassandra 將 memtable 清除到磁碟前的時間 (毫秒)

read_repair

簡單

BLOCKING

設定讀取修復行為 (請見下方)

推測重試選項

預設情況下,Cassandra 讀取協調器僅查詢滿足一致性層級所必需的複本數量:一致性層級 ONE 為一個,QUORUM 為法定人數,依此類推。speculative_retry 決定協調器何時可以查詢其他複本,這在複本速度緩慢或沒有回應時很有用。推測重試可減少延遲。speculative_retry 選項會設定快速讀取保護,其中協調器會傳送比滿足一致性層級所需的請求更多。

頻繁從其他複本讀取可能會損害叢集效能。如有疑問,請保留預設值 99PERCENTILE

Cassandra 4.0 之前的推測重試政策將單一字串作為參數

  • NONE

  • ALWAYS

  • 99PERCENTILE (PERCENTILE)

  • 50MS (CUSTOM)

設定推測重試的範例設定自訂值

ALTER TABLE users WITH speculative_retry = '10ms';

此範例使用百分位數作為設定

ALTER TABLE users WITH speculative_retry = '99PERCENTILE';

百分位數設定可能會適得其反。如果單一主機無法使用,可能會強制提高百分位數。p99 的值不會如預期般推測,因為指定百分位數的值已增加太多。如果一致性層級設定為 ALL,則無論推測重試設定為何,都會查詢所有複本。

Cassandra 4.0 支援推測重試值的非大小寫敏感性 (CASSANDRA-14293)。例如,將值指定為 noneNoneNONE 會產生相同的結果。

此外,還會新增下列值

格式 範例 說明

XPERCENTILE

90.5PERCENTILE

協調器會記錄所有複本的每個表格平均回應時間。如果複本花費的時間超過此表格平均回應時間的 X 百分比,協調器會查詢其他複本。X 必須介於 0 到 100 之間。

XP

90.5P

XPERCENTILE 相同

Yms

25 毫秒

如果副本花費超過 Y 毫秒來回應,協調器會查詢其他副本。

MIN(XPERCENTILE,YMS)

MIN(99PERCENTILE,35MS)

一種混合政策,會根據計算時較低的值來使用指定的百分位數或固定毫秒數。參數為 XPERCENTILEXPYms。此設定有助於防止單一執行個體過慢。

MAX(XPERCENTILE,YMS) ALWAYS NEVER

MAX(90.5P,25ms)

一種混合政策,會根據計算時較高的值來使用指定的百分位數或固定毫秒數。

Cassandra 4.0 新增對混合 MIN()MAX() 推測重試政策的支援,並混合搭配 MIN(), MAX()MIN(), MIN()MAX(), MAX() (CASSANDRA-14293)。如果資料表的正常 p99 小於最小值 50 毫秒,混合模式仍會推測。但如果 p99 層級高於最大值,則可以使用該值。在混合值中,一個值必須是固定時間 (ms) 值,另一個值必須是百分位數值。

為了說明變異,以下範例皆為有效

min(99percentile,50ms)
max(99p,50MS)
MAX(99P,50ms)
MIN(99.9PERCENTILE,50ms)
max(90percentile,100MS)
MAX(100.0PERCENTILE,60ms)

additional_write_policy 設定會指定將便宜的定額寫入升級為包含暫時副本的閾值。

壓縮選項

compaction 選項必須至少定義 'class' 子選項,以指定要使用的壓縮策略類別。支援的類別為

  • 'SizeTieredCompactionStrategy'STCS (預設)

  • 'LeveledCompactionStrategy'LCS

  • 'TimeWindowCompactionStrategy'TWCS

如果需要自訂策略,請指定完整類別名稱為 字串常數

所有預設策略都支援多個 常見選項,以及特定於所選策略的選項。請參閱與您的策略相應的部分以取得詳細資訊:STCSLCSTWCS

壓縮選項

compression 選項定義表格的 SSTable 是否壓縮以及如何壓縮。壓縮會在每個表格的基礎上設定,做為 CREATE TABLEALTER TABLE 的選用引數。下列子選項可用

選項 預設值 說明

class

LZ4Compressor

要使用的壓縮演算法。預設壓縮器為:LZ4Compressor、SnappyCompressor、DeflateCompressor 和 ZstdCompressor。使用 'enabled' : false 來停用壓縮。自訂壓縮器可透過指定完整類別名稱做為 字串常數 來提供。

enabled

true

啟用/停用 sstable 壓縮。如果 enabled 選項設為 false,則不得指定任何其他選項。

chunk_length_in_kb

64

磁碟上的 SSTable 會按區塊壓縮(以允許隨機讀取)。此選項定義所述區塊的大小(以 KB 為單位)。請參閱 註解 以取得進一步資訊。

compression_level

3

壓縮等級。僅適用於 ZstdCompressor。接受介於 -13107222 之間的值。

較大的值可能會改善壓縮率,但會增加從磁碟讀取資料的最小大小以進行讀取。預設值是壓縮表格的最佳值。從未壓縮的檔案偏移量計算區塊編號時,區塊長度必須為 2 的次方。區塊大小可能會根據讀取/寫入存取模式調整,例如

  • 一次通常會要求多少資料

  • 表格中列的平均大小

例如,要建立一個使用 LZ4Compressor 且 chunk_length_in_kb 為 4 KB 的表格

CREATE TABLE simple (
   id int,
   key text,
   value text,
   PRIMARY KEY (key, value)
) WITH compression = {'class': 'LZ4Compressor', 'chunk_length_in_kb': 4};
快取選項

快取會最佳化表格快取記憶體的使用。快取的資料會根據大小和存取頻率加權。caching 選項可以設定表格的 key 快取row 快取。下列子選項可用

選項 預設值 說明

keys

ALL

是否要快取此表格的鍵(key 快取)。有效值為:ALLNONE

rows_per_partition

NONE

每個分割區要快取的列數(row 快取)。如果指定整數 n,則會快取分割區中查詢到的前 n 列。有效值為:ALL,以快取查詢分割區的所有列,或 NONE 以停用列快取。

例如,要建立一個同時具有 key 快取和每個分割區快取 10 列的表格

CREATE TABLE simple (
id int,
key text,
value text,
PRIMARY KEY (key, value)
) WITH caching = {'keys': 'ALL', 'rows_per_partition': 10};
讀取修復選項

read_repair 選項會設定讀取修復行為,調整各種效能和一致性行為。

值為

選項 預設值 說明

BLOCKING

如果觸發讀取修復,則讀取會區塊寫入傳送至其他複本,直到寫入達到一致性層級。

NONE

如果設定,則協調器會調和複本之間的任何差異,但不會嘗試修復它們。

兩個一致性屬性會受到讀取修復行為影響。

  • 單調法定人數讀取:單調法定人數讀取可防止讀取在某些情況下看起來會倒退。當未提供單調法定人數讀取,且寫入未達到複本的法定人數時,讀取值可能會在一次讀取中可見,然後在後續讀取中消失。BLOCKING 會提供此行為。

  • 寫入原子性:寫入原子性可防止讀取傳回部分套用的寫入。Cassandra 會嘗試提供分割層級的寫入原子性,但由於只有 SELECT 陳述式涵蓋的資料會由讀取修復修復,因此當以比寫入更細緻的層級讀取資料時,讀取修復會中斷寫入原子性。例如,如果您在批次中寫入多列至群集分割,但接著在 SELECT 陳述式中指定群集欄位來選取單一列,則讀取修復會中斷寫入原子性。NONE 會提供此行為。

其他考量
  • 新增欄位(請參閱下方的 ALTER TABLE)是常數時間操作。因此,在最初建立表格時無需預期未來使用情況。

ALTER TABLE

變更現有表格會使用 ALTER TABLE 陳述式

alter_table_statement::= ALTER TABLE [ IF EXISTS ] table_name alter_table_instruction
alter_table_instruction::= ADD [ IF NOT EXISTS ] column_definition ( ',' column_definition)*
	| DROP [ IF EXISTS ] column_name ( ',' column_name )*
	| RENAME [ IF EXISTS ] column_name to column_name (AND column_name to column_name)*
	| ALTER [ IF EXISTS ] column_name ( column_mask | DROP MASKED )
	| WITH options
column_definition::= column_name cql_type [ column_mask]
column_mask::= MASKED WITH ( DEFAULT | function_name '(' term ( ',' term )* ')' )

如果表格不存在,則陳述式會傳回錯誤,除非使用 IF EXISTS,這種情況下操作會是無動作。

例如

ALTER TABLE addamsFamily ADD gravesite varchar;
ALTER TABLE addamsFamily
   WITH comment = 'A most excellent and useful table';

ALTER TABLE 陳述式可以

  • ADD 新欄位至表格。表格的主鍵永遠無法變更。因此,新欄位無法成為主鍵的一部分。新增欄位是常數時間操作,根據表格中的資料量而定。如果新欄位已存在,則陳述式會傳回錯誤,除非使用 IF NOT EXISTS,這種情況下操作會是無動作。

  • DROP 表格中的欄位。此指令會刪除欄位及其所有內容。請注意,雖然欄位會立即不可用,但其內容會在壓縮期間延遲移除。由於這種延遲移除,此指令是常數時間操作,根據表格中的資料量而定。此外,重要的是要知道一旦刪除欄位,就可以重新新增具有相同名稱的欄位,除非已刪除的欄位是非凍結欄位,例如集合。如果已刪除的欄位不存在,則陳述式會傳回錯誤,除非使用 IF EXISTS,這種情況下操作會是無動作。

警告

刪除欄位假設此欄位的值所使用的時間戳記是微秒中的「實際」時間戳記。使用微秒中的「實際」時間戳記是預設值,且強烈建議使用,但由於 Cassandra 允許用戶在任何表格上提供任何時間戳記,因此理論上可以使用其他慣例。請注意,如果您這麼做,刪除欄位將無法正確執行。

  • RENAME 表格的主鍵欄位。無法重新命名非主鍵欄位。此外,不允許將欄位重新命名為已存在的其他名稱。請務必記住,重新命名的欄位不應有相依的次要索引。如果重新命名的欄位不存在,則陳述式會傳回錯誤,除非使用 IF EXISTS,否則操作為無動作。

  • 使用 WITH 變更表格選項。 支援的選項 與建立表格時使用的選項相同,但 CLUSTERING ORDER 除外。但是,設定任何 compaction 子選項會清除所有先前的 compaction 選項,因此您需要重新指定您想要保留的所有子選項。compression 子選項也是如此。

DROP TABLE

刪除表格使用 DROP TABLE 陳述式

drop_table_statement::= DROP TABLE [ IF EXISTS ] table_name

刪除表格會立即且不可逆地移除表格,包括其中包含的所有資料。

如果表格不存在,則陳述式會傳回錯誤,除非使用 IF EXISTS,否則操作為無動作。

TRUNCATE TABLE

可以使用 TRUNCATE 陳述式來截斷表格

truncate_statement::= TRUNCATE [ TABLE ] table_name

TRUNCATE TABLE foo 是首選的語法,以與其他 DDL 陳述式保持一致。但是,表格是目前唯一可以截斷的物件,且可以省略 TABLE 關鍵字。

截斷表格會永久移除表格中所有現有的資料,但不會移除表格本身。