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

  • 二级索引
    Lindorm CQL支持在表上创建二级索引,从而允许查询表时使用这些索引。二级索引由以下名称定义:
    index_name ::=  re('[a-zA-Z_0-9]+')

    如果要使用高性能二级索引,请参见二级索引(HBase API兼容)

  • Search Index
    Search Index支持的功能如下:
    • 多维查询。给定多个列的随机组合,快速返回查询结果。
    • 排序。提供Order By能力,返回结果按照任意指定列进行排序。
    • 模糊匹配。

    如果您想要通过Lindorm CQL使用Search Index,需要先在Lindorm上开通全文检索以及LTS服务,请参见全文索引

CREATE KEYSPACE

创建Keyspace。

语法
CREATE KEYSPACE [ IF NOT EXISTS ] keyspace_name WITH options
说明 Keyspace在Lindorm中类似于Namespace的概念,由于底层设计限制,所以Lindorm CQL暂时不支持设置副本复制策略以及副本数,都是使用默认参数。
参数
参数名称 示例值 描述
keyspace_name testks 键值空间名称。
options replication 目前取值固定为replicationdurable_writes
  • replication:Map类型。表示副本的默认数据,底层默认2副本存储。
  • durable_writes:Boolean类型。表示数据是否持久化写入。默认值为True。
示例
CREATE KEYSPACE testks WITH replication = {'class': 'SimpleStrategy', 'replication_factor': 1}
说明 Lindorm CQL Keyspace兼容层暂时不支持设置replicationdurable_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 keyclustering columns组成PRIMARY KEY,单独的partition keyclustering 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 keycluster column组合在一起共同决定一条数据属于哪个节点,而不是CQL中由partition key单独决定一条数据属于哪个节点,例如上述例子中row1和row2在Lindorm CQL中可以确定是在一个节点中,但是在Lindorm CQL中并不能保证,这是Lindorm CQL与传统CQL的较大区别。

示例
CREATE TABLE tb (name text PRIMARY KEY , age int);   //默认创建以name为主键的表。
CREATE TABLE ttltb (name text PARIMARY KEY, age int) WITH defult_time_to_live = 1000;  //设置表的ttl时间是1000s。
CREATE TABLE cptb (name text PRIMARY KEY, age int) WITH 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确定该行数据从属的物理节点。

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_TYPE,配置值为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_livecompressionextensions选项的设置。
示例
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);