本節介紹DDL語法的說明和示例。
概述
Lindorm CQL將數據存儲在表中,其模式定義了表中所述數據的布局,并且這些表被分組在鍵空間中。Keyspace定義了許多選項,這些選項適用于它包含的所有Table,其中最主要的是Keyspace使用的復制策略,這里Lindorm CQL并不支持Keyspace的復制策略定義,以及副本數的定義,都是默認定義的值。Lindorm CQL支持使用CQL語言操作Lindorm高性能二級索引以及Lindorm全文索引Search Index,滿足用戶對于索引的使用需求。
Keyspace和Table的語法定義
Lindorm CQL Keyspace語法定義:
keyspace_name ::= name
name ::= unquoted_name | quoted_name
unquoted_name ::= re('[a-zA-Z_0-9]{1, 48}')
quoted_name ::= '"' unquoted_name '"'
Lindorm CQL Table語法定義:
table_name ::= [ keyspace_name '.' ] name
name ::= unquoted_name | quoted_name
unquoted_name ::= re('[a-zA-Z_0-9]{1, 48}')
quoted_name ::= '"' unquoted_name '"'
Keyspace名和Table名都由字母、數字、字符組成,不能為空。
Keyspace名和Table名不超過48個字符。該限制主要是為了避免文件名(可能包括Keyspace名和Table名)超過某些文件的限制系統。
默認情況下,Keyspace名和Table名不區分大小寫,比如myTable和mytable是一樣的。但使用雙引號可強制進行區分,例如“myTable”和"mytable"是不一樣的。
表是Keyspace的一部分,并且表名可以由Keyspace名進行強制限定,比如:鍵空間KS和鍵空間GC都具有表Table,但他們的表名分別為ks.table和gc.table。
索引
Lindorm CQL同時支持二級索引和基于搜索引擎的Search Index。
CREATE KEYSPACE
創建Keyspace。
語法
CREATE KEYSPACE [ IF NOT EXISTS ] keyspace_name WITH options
Keyspace在Lindorm中類似于Namespace的概念,由于底層設計限制,所以Lindorm CQL暫時不支持設置副本復制策略以及副本數,都是使用默認參數。
參數
參數名稱 | 示例值 | 描述 |
keyspace_name | testks | 鍵值空間名稱。 |
options | replication | 目前取值固定為replication和durable_writes。
|
示例
CREATE KEYSPACE testks WITH replication = {'class': 'SimpleStrategy', 'replication_factor': 1};
Lindorm CQL Keyspace兼容層暫時不支持設置replication和durable_writes屬性,您可以看到默認的2副本或者默認值為True的durable_writes屬性,后續會開放對應功能設置。
ALTER KEYSPACE
修改Keyspace的選項。
語法
ALTER KEYSPACE keyspace_name WITH options
ALTER KEYSPACE語句中的options和CREATE KEYSPACE語句中的options是一樣的,但是由于Keyspace級別的options都是默認的,所以無需修改。
參數
ALTER KEYSPACE語句中的options和CREATE KEYSPACE語句中的options是一樣的,請參見參數說明。
示例
ALTER KEYSPACE testks WITH replication = {'class': 'SimpleStrategy', 'replication_factor': 1};
USE
使用某個Keyspace。Lindorm CQL中的許多對象都綁定到一個鍵空間(表、用戶定義的類型、函數等),并且當前鍵空間是在引用這些對象而沒有完全限定的名稱(即沒有前綴)時使用的默認鍵空間、鍵空間名稱。
語法
USE keyspace_name
參數
參數名稱 | 示例值 | 描述 |
keyspace_name | testks | 鍵值空間名稱。 |
示例
USE testks;
DROP KEYSPACE
刪除Keyspace。
語法
DROP KEYSPACE [ IF EXISTS ] keyspace_name
使用DROP KEYSPACE刪除Keyspace會立即生效并且不可恢復,包括Keyspace中的所有表、UTD和函數以及這些表中包含的所有數據。
如果Keyspace不存在,使用該語句系統會返回錯誤。除非您使用
IF EXISTS
,系統不返回錯誤,但該操作為無效操作。只有root用戶具有DROP KEYSPACE的權限。
參數
參數名稱 | 示例值 | 描述 |
keyspace_name | testks | 鍵值空間名稱。 |
示例
DROP KEYSPACE testks;
CREATE TABLE
創建TABLE。
語法
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 ] [ PRIMARY KEY]
primary_key ::= partition_key [ ',' clustering_columns ]
partition_key ::= column_name
| '(' column_name ( ',' column_name )* ')'
clustering_columns ::= column_name ( ',' column_name )*
table_options ::= CLUSTERING ORDER BY '(' clustering_order ')' [ AND options ]
| options
clustering_order ::= column_name (ASC | DESC) ( ',' column_name (ASC | DESC) )*
說明
Lindorm CQL表具有名稱,由一組行組成。創建TABLE表示將定義一行數據將由哪些列組成,哪些列將組成主鍵(Primary Key)以及該表的可選選項(Table Options)。除非使用IF NOT EXISTS
語句,否則創建一個已經存在的表將返回錯誤。
Lindorm CQL表中的每一行都有一組預定義列,這些預定義列在創建表時定義(或后面使用ALTER語句添加)。
column_definition
主要由定義的列的名稱和類型組成,它限制了該列接受哪些值。此外,列定義可以具有以下修飾符:
STATIC
:表示將列聲明為靜態列(暫不支持)。PRIMARY KEY
:表示該列是表主鍵的唯一組成部分。
在一個表中,一行數據由其PRIMARY KEY
唯一標識,因此所有表都必須定義一個PRIMARY KEY
(只有一個)。PRIMARY KEY
定義由表中定義的一列或多列組成。在語法上,主關鍵字定義為關鍵字PRIMARY KEY
,后跟用括號括起來的列名稱的列表,該列名稱用括號括起來,但是如果主鍵只有一列,則可以用PRIMARY KEY
關鍵字替換該列定義。主鍵中定義的列的順序很重要,將會影響數據的分布和存儲順序。
Lindorm CQL主鍵由兩部分組成:
partition key
:它是主鍵(Primary Key)的第一部分。它可以是單個列,或者使用附加的括號可以是多個列。一個表總是至少有一個分區鍵。clustering columns
:這些是主鍵定義的第一部分之后的列,這些列的順序定義了聚類順序,Lindorm CQL中允許不定義clustering columns
。
PRIMARY KEY
定義的一些示例:
PRIMARY KEY(a):a是分區鍵,沒有聚類列。
PRIMARY KEY(a,b,c):a是分區鍵,b和c是聚簇列。
PRIMARY KEY((a,b),c):a和b組成分區鍵(通常稱為復合分區鍵),c是聚簇列。
在Lindorm CQL中,PRIMARY KEY
具有較強的意義,partition key
和clustering columns
組成PRIMARY KEY
,單獨的partition key
或clustering columns
不具有獨立使用的意義。
在表中,Lindorm CQL定義分區的概念。分區就是一組共享相同分區鍵值的行。請注意,如果分區鍵由多個列組成,則行僅屬于同一分區,并且所有分區鍵列的值都相同。給定以下表定義和內容:
CREATE TABLE persioninfo (
a int,
b int,
c int,
d int,
PRIMARY KEY ((a, b), c, d)
);
SELECT * FROM persioninfo;
a | b | c | d
---+---+---+---
0 | 0 | 0 | 0 // row 1
0 | 0 | 1 | 1 // row 2
0 | 1 | 2 | 2 // row 3
0 | 1 | 3 | 3 // row 4
1 | 1 | 4 | 4 // row 5
Lindorm CQL中,partition key
以及clustering columns
共同組成PRIMARY KEY
,他們的地位是等價的,Lindorm CQL中partition key
和cluster column
組合在一起共同決定一條數據屬于哪個節點,而不是CQL中由partition key
單獨決定一條數據屬于哪個節點,例如上述例子中row1和row2在Lindorm CQL中可以確定是在一個節點中,但是在CQL中并不能保證,這是Lindorm CQL與傳統CQL的較大區別。
示例
CREATE TABLE tb (name text PRIMARY KEY , age int); //默認創建以name為主鍵的表。
CREATE TABLE ttltb (name text PRIMARY KEY, age int) WITH defult_time_to_live = 1000; //設置表的ttl時間是1000s。
CREATE TABLE cptb (name text PRIMARY KEY, age int) WITH compression = {'sstable_compression': 'LZ4Compressor'}; //設置壓縮為LZ4壓縮;默認是SNAPPY。
CREATE TABLE hct ( name text PRIMARY KEY , age int ) WITH extensions = {'COLD_BOUNDARY':'10'}; //設置lindorm的冷熱分離的時間線是10s。
Lindorm CQL Table暫不支持的定義功能
partition key:確定數據分布式從屬的對應節點,Lindorm CQL不能由單一的partition key
確定該行數據從屬的物理節點。
支持的table_Option列表
Lindorm CQL的table_options
和Cassandra的table_options
有一定差異,Lindorm CQL目前支持如下的選項設置。
選項 | 類型 | 描述 |
default_time_to_live | int | 表的默認到期時間(“ TTL”),以秒為單位。默認值為0。 |
compression | map | 可以設置對應文件(sstable)的compression算法,支持LZ4、ZSTD、SNAPPY算法。具體請參考下文Compresion介紹。 |
extensions | map | 支持擴展設置,包括設置是否使用冷存儲、使用冷熱分離、表的一致性級別等屬性。具體請參考下文Extensions介紹。 |
Compression
Lindorm CQL支持如下幾種可配置的壓縮算法,各個壓縮算法的系數暫時使用默認參數進行設置。
LZ4(LZ4Compressor)。創建LZ4壓縮的表如下:
CREATE TABLE persioninfo ( id int, name text, address text, PRIMARY KEY (id, name) ) with compression = {'class': 'LZ4Compressor'};
ZSTD(ZstdCompressor)。創建ZSTD壓縮的表如下:
CREATE TABLE persioninfo ( id int, name text, address text, PRIMARY KEY (id, name) ) with compression = {'class': 'ZstdCompressor'};
SNAPP(SnappyCompressor)。創建SNAPPY壓縮的表如下:
CREATE TABLE persioninfo ( id int, name text, address text, PRIMARY KEY (id, name) ) with compression = {'class': 'SnappyCompressor'};
compression屬性也可以通過ALTER TABLE
語法進行修改設置。
Extensions
對于Lindorm的特有屬性我們通過extensions擴展屬性進行設置,擴展屬性如下:
冷存儲。關鍵字為
STORAGE_POLICY
,配置值為COLD
表示冷存儲,DEFAULT
表示使用默認熱存儲。CREATE TABLE persioninfo (name text PRIMARY KEY, age int) WITH extensions = {'STORAGE_POLICY' : 'COLD'}; //建表指定表為冷存儲。 ALTER TABLE persioninfo WITH extensions = {'STORAGE_POLICY' : 'DEFAULT'}; //修改表屬性為熱存儲。
冷熱分離。關鍵字為
COLD_BOUNDARY
,在冷熱分離使用過程中,無需把表或列簇的屬性設置為COLD,如果已經把列簇的屬性設置為了COLD,請您將冷存儲的屬性去除,具體請參考冷存儲介紹。CREATE TABLE persioninfo (name text PRIMARY KEY, age int) with extensions = {'COLD_BOUNDARY':'86400'}; //建表指定冷熱分離時間線為1天(86400秒),超過時間線數據被寫到冷介質。 ALTER TABLE persioninfo with extensions = {'COLD_BOUNDARY':''}; //取消冷熱分離。 ALTER TABLE persioninfo with extensions = {'COLD_BOUNDARY':'1000'}; //修改時間線為1000s。
CONSISTENCY_TYPE:對于lindorm多zone場景下,設置表的一致性級別,有eventual、timtstamp、basic、strong四種級別。
CREATE TABLE persioninfo (name text PRIMARY KEY, age int) with extensions = {'CONSISTENCY_TYPE':'strong'}; //建表一致性級別為strong。 ALTER TABLE persioninfo with extensions = {'CONSISTENCY_TYPE':'eventual'}; //修改一致性級別為eventual。
Mutability:用戶在使用二級索引、search index之前需要設置Mutability,取值:IMMUTABLE、IMMUTABLE_ROWS(CONSISTENCY_TYPE必須為strong),MUTABLE_LATEST(CONSISTENCY_TYPE必須為strong),MUTABLE_ALL(建表默認的級別,CONSISTENCY_TYPE必須為strong)。
CREATE TABLE persioninfo (name text PRIMARY KEY, age int) with extensions = {'MUTABILITY':'IMMUTABLE'}; //建表指定mutability為IMMUTABLE。 ALTER TABLE persioninfo with extensions = {'MUTABILITY':'MUTABLE_LATEST'}; //修改表mutability為MUTABLE_LATEST。
暫不支持的table_Option列表
選項 | 類型 | 描述 |
comment | string | 表示對表的描述。默認值為f。 |
speculative_retry | simple simple | 默認值為99PERCENTILE。 |
cdc | boolean | 在表上創建一個更改數據捕獲(CDC)日志。默認值為false。 |
gc_grace_seconds | int | 等待垃圾收集墓碑(刪除標記)之前的時間。默認值為86400。 |
bloom_filter_fp_chance | float | 穩定布隆過濾器誤報的目標概率。所述布隆過濾器的大小將確定所提供的概率,因此降低此值會影響內存中和磁盤上布隆過濾器的大小。默認值為0.00075。 |
compaction | map | 默認值為STCS策略。 |
caching | map | 無 |
memtable_flush_period_in_ms | map | 默認值為0。 |
read_repair | int | 默認值為BLOCKING。 |
ALTER TABLE
修改TABLE。
語法
ALTER TABLE table_name alter_table_instruction
alter_table_instruction ::= ADD column_name cql_type ( ',' column_name cql_type )*
| DROP column_name ( column_name )*
| WITH options
說明
ALTER TABLE
語句可以進行以下操作:
可以通過ADD指令,將新列添加到表中。由于表的主鍵無法更改,因此新添加的列將永遠不會成為主鍵的一部分。需要注意,緊湊表對列添加有一定的限制。
Lindorm CQL暫時不支持DROP column操作。
可以通過WITH指令,更改表的選項。支持修改的表的選項與創建表時的選項相同,但是無法更改
CLUSTERING ORDER
。Lindorm CQL支持修改default_time_to_live
、compression
、extensions
選項的設置。
示例
CREATE TABLE persioninfo (name text PRIMARY KEY, age int);
ALTER TABLE persioninfo ADD address text;
DROP TABLE
刪除TABLE。
語法
DROP TABLE [ IF EXISTS ] table_name
使用DROP TABLE刪除TABLE會立即生效并且不可恢復,包括Table中的所有數據。
如果TABLE不存在,使用該語句系統會返回錯誤。除非您使用
IF EXISTS
,系統不返回錯誤,但該操作為無效操作。只有root用戶具有DROP TABLE的權限。
參數
參數名稱 | 示例值 | 描述 |
table_name | persioninfo | 表名稱。 |
示例
DROP TABLE persioninfo;
TRUNCATE
清空表數據。
語法
TRUNCATE [ TABLE ] table_name
使用
TRUNCATE
會永久刪除表中所有的數據,但不會刪除表本身的表結構狀態。只有root用戶具有TRUNCATE TABLE的權限。
參數
參數名稱 | 示例值 | 描述 |
table_name | persioninfo | 表名稱。 |
示例
TRUNCATE TABLE persioninfo;
CREATE INDEX
創建二級索引。
語法
CREATE [ CUSTOM ] INDEX [ IF NOT EXISTS ] [ index_name ]
ON table_name '(' index_identifier ')'
[ USING string [ WITH OPTIONS = map_literal ] ]
index_identifier ::= column_name
| '(' column_name ')'
說明
CREATE INDEX
語句用于為指定的表中的列自動創建二級索引。您可以在ON
關鍵字之前指定索引名。如果該列已經存在數據,則將對其進行異步索引。創建索引后,您在插入數據時,系統將自動為該列的新數據建立索引。
如果創建一個已經存在的索引系統將返回錯誤。如果使用IF NOT EXISTS
選項創建一個已經存在的索引,則操作屬于無效操作。
CREATE INDEX
語句只支持對單個列進行索引構建。如果想要對表下面的多個列構建索引的話,您可以使用CREATE CUSTOM INDEX
語句中的USING 'com.alibaba.lindorm.cserver.schema.index.LindormSecondaryIndex'
進行構建。
示例
CREATE INDEX myindex ON persioninfo (c2);
CREATE INDEX ON persioninfo (c2);
CREATE CUSTOM INDEX myindex ON persioninfo (c1,c2) USING 'com.alibaba.lindorm.cserver.schema.index.LindormSecondaryIndex';
DROP INDEX
刪除二級索引。
語法
DROP INDEX [ IF EXISTS ] index_name
使用
DROP INDEX
語句用于刪除已存在的二級索引。語句的變量是索引名稱index_name
,可以選擇指定索引的鍵空間。如果索引不存在,使用該語句系統會返回錯誤。除非您使用
IF EXISTS
,系統不返回錯誤,但該操作為無效操作。
示例
DROP INDEX myindex;
CREAT SEARCH INDEX
創建全文索引。
語法
CREATE SEARCH INDEX [ IF NOT EXISTS ] index_name ON [keyspace_name.]table_name
| [ WITH [ COLUMNS (column1,...,columnn) ]
| [ WITH [ COLUMNS (*) ]
CREATE SEARCH INDEX
語句支持在源數據表的某些列上構建全文索引。WITH COLUMNS(column)
:指定某個或某幾個列構建SEARCH INDEX,各column間以英文逗號(,)分隔。WITH COLUMNS(*)
:使用(*)符號表示對所有列構建全文索引。創建SEARCH INDEX的表需要對源數據表的屬性通過Extension進行擴展。如果是Lindorm多Zone場景下,默認需要指定一致性以及MUTABLE屬性,非多Zone場景下不需要進行設置。
示例
CREATE SEARCH INDEX schidx ON persioninfo WITH COLUMNS (c2, c3);
DROP SEARCH INDEX
刪除全文索引。
語法
DROP SEARCH INDEX [IF EXISTS] ON [keyspace_name.]table_name;
示例
DROP SEARCH INDEX ON testks.persioninfo;
REBUILD SEARCH INDEX
將索引狀態設置為有效。
語法
REBUILD SEARCH INDEX [ASYNC] [IF EXISTS] ON [keyspace_name.]table_name;
全文索引構建完成以后,索引的狀態是INACTIVE
的,需要手動執行REBUILD
操作,才能將索引狀態置為有效。執行REBUILD
操作還會為存量數據構建SEACH INDEX,整個過程會比較漫長,可以通過ASYNC
參數指定此次構建是異步操作。
示例
REBUILD SEARCH INDEX ON persioninfo;
REBUILD SEARCH INDEX ASYNC ON persioninfo;
ALTER SEARCH INDEX
修改全文索引的狀態、手動添加索引列或者刪除索引列。
語法
ALTER SEARCH INDEX SCHEMA [IF EXISTS] ON [keyspace_name.]table_name
( ADD FIELD column_name
| DROP FIELD column_name) ;
使用
ALTER SEARCH INDEX
修改全文索引的狀態后,需要使用REBUILD
重建索引的狀態。添加
ADD SEARCH INDEX
或刪除DROP SEARCH INDEX
的索引列需要在源數據表中存在。
示例
ALTER SEARCH INDEX SCHEMA ON persioninfo ADD (c3);
ALTER SEARCH INDEX SCHEMA ON persioninfo DROP (c2);