本节介绍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);