在HybridDB for MySQL中可以通过如下语法来创建表。

创建表

CREATE TABLE db_name.table_name (
    auto_id bigint [NOT NULL] AUTO_INCREMENT,
    col1 boolean [NULL | NOT NULL] [DEFAULT default_value],
    col2 tinyint [NULL | NOT NULL] [DEFAULT default_value],
    col3 smallint [NULL | NOT NULL] [DEFAULT default_value],
    col4 int [NULL | NOT NULL] [DEFAULT default_value],
    col5 bigint [NULL | NOT NULL] [DEFAULT default_value],
    col6 float [NULL | NOT NULL] [DEFAULT default_value],
    col7 double [NULL | NOT NULL] [DEFAULT default_value],
    col8 varchar [NULL | NOT NULL] [DEFAULT default_value],
    col9 timestamp [NULL | NOT NULL] [DEFAULT default_value|current_timestamp],  
    col10 date [NULL | NOT NULL] [DEFAULT default_value|current_date],
    col11 multivalue [NULL | NOT NULL] [DEFAULT default_value] [delimiter_tokenizer ': ,'|nlp_tokenizer 'ik'] [value_type 'varchar int'],
    col12 geo2d [NULL | NOT NULL] [DEFAULT default_value] [delimiter_tokenizer ','],
    [key col3_index(col3)],
    [key col4_index(col4)],
    [clustering key col5_col6_cls_index(col5,col6)],
    [primary key (col1, col3)]
)
DISTRIBUTE BY HASH(col1) | DISTRIBUTE BY BROADCAST
[PARTITION BY VALUE(col9 | YEARMONTHDAY(col9)) PARTITIONS 365]
[INDEX_ALL='Y'|'N']
[ENGINE='CSTORE']
            

建表语法详细说明:

  • 表名定义

    只能由字母+数字+下划线组成,不支持中文及其他字符,表名最长64个字符。

  • 自增类型定义

    auto_id bigint NOT NULL AUTO_INCREMENT用于定义自增列,必须是bigint类型;HybridDB for MySQL提供唯一值,但是不能保证单调递增。递增列在建表过程中是可选的,通常用户如果没有比较的分布键,可以通过新增自增列并其做为分区key来达到均匀打散数据的目标。

  • 普通列定义

    col4 intcol8 varchar用于定义整数列和字符串列。需要注意的是,HybridDB for MySQL对于每个类型默认有精度定义,因此对于col8 varchar(8)这类的精度定义会被忽略掉。列名最长64个字符。

  • 一级分区定义/事实表

    DISTRIBUTE BY HASH(col1) 用于定义表的分布键,表明该表是事实表(分区表,按照col1的HASH值来做分布键,HybridDB for MySQL也支持多个字段作为分布键。分布键的选择通常需要考虑数据分布的均匀度(比如自增字段)、事实表之间的join key的对齐(比如按照user_id/order_id等)。

  • 维度表(广播表)定义

    DISTRIBUTE BY BROADCAST用于定义维度表(广播表),维度表会在每个节点都会有一个冗余副本,所以建议维度表的数据量不要太大。

  • 二级分区定义

    PARTITION BY VALUE(col9 | YEARMONTHDAY(col9)) PARTITIONS 365用于定义二级分区,通常是按照天或者周、月、年等时间单位来定义,PARTITION BY VALUE(col9)表示按照col9的值来做二级分区值,要求col9必须是数字类型。PARTITION BY YEARMONTHDAY(col9)表示按照col9格式化为20170101这种日期的数字格式。PARTITIONS 365表示二级分区最多保留的个数,比如数据保存365天,第366天写入后会自动过期掉第1天的数据。

    重要

    二级分区自动过期是Shard级别,也就是每个Shard会保留365个分区,因为数据分布不一定均匀,这会导致从表级来看,数据中包含了多余365天的数据,不能基于此来保证无条件查询的范围一定只有365个分区。

    自动过期的时机不是一定的,属于内部机制,单个Shard也可能超过365个分区,一般数小时会触发一次调度并自动过期掉。

  • 智能查询索引定义

    key col3_index(col3) 或者 INDEX_ALL='Y' 用于定义智能查询索引,key col3_index(col3)表示以第三列创建名称为col3_index的索引。INDEX_ALL='Y'是直接定义所有列都自动索引(全索引,在成本不是特别高数据量不是特别大的情况下,建议通过 INDEX_ALL='Y'一键自动全索引。

  • 主键定义

    primary key (col1, col3) 用于定义主键,用于支持Delete和Update操作。需要注意,主键一定要包含分区键,并且顺序上尽可能把分区键放到组合主键定义的前面。

  • 聚集索引定义

    clustering key col5_col6_cls_index(col5,col6) 定义了col5 col6的聚集索引,需要注意的是,聚集索引实际是排序索引,索引的类型和列的顺序关系严格相关。因此 col5 col6col6 col5是不同的排序索引。聚集索引有助于加速一定会带某个列做为where条件的查询。

  • 多值列定义

    col11 multivalue delimiter_tokenizer ',' value_type 'varchar 定义了只有一个子列的多值列,单个cell的值用,(逗号分隔,每个值的类型为varchar,比如值A,B,C,而col11 multivalue delimiter_tokenizer ': ,' value_type 'varchar int'则定义了有2个子列的多值列,单个cell先用分号:分隔,再用逗号,分隔,比如值A:100,B:80。

  • 全文索引列定义

    col11 multivalue nlp_tokenizer 'ik'定义了ik做为分词器的全文索引列。

  • 经纬度列定义

    col12 geo2d delimiter_tokenizer ','定义了col12为经纬度列,经度和纬度的分隔符为,

  • 指定引擎

    指定引擎定义,分析引擎实例默认的引擎是Cstore列式存储引擎。

新增和删除列

ALTER TABLE db_name.table_name ADD COLUMN column_name bigint
ALTER TABLE db_name.table_name ADD COLUMN column_name bigint default 1234
ALTER TABLE db_name.table_name ADD COLUMN column_name bigint comment 'column_name评论'
ALTER TABLE db_name.table_name ADD COLUMN column_name bigint default 1234 comment 'column_name评论'
#修改评论
ALTER TABLE db_name.table_name MODIFY [COLUMN] column_name [column_type] comment 'column_name评论'
#修改 NULL/NOT NULL
ALTER TABLE db_name.table_name MODIFY [COLUMN] column_name [column_type] {NULL | NOT NULL}
#修改 DEFAULT
ALTER TABLE db_name.table_name MODIFY [COLUMN] column_name column_type DEFAULT 'column_name默认值'
完整: 
ALTER TABLE db_name.table_name MODIFY [COLUMN] column_name column_type [NULL | NOT NULL] [DEFAULT 'column_name默认值'] [COMMENT 'column_name评论']
s
重要
  • 修改DEFAULT值时需要定义列的值类型,目前即使带上了column_type也不支持修改列类型。
  • 暂时不支持删除列。

新增和删除索引

ALTER TABLE db_name.table_name ADD CLUSTERING KEY c_k(c3,c4);

ALTER TABLE db_name.table_name DROP CLUSTERING KEY c_k;

ALTER TABLE db_name.table_name ADD KEY k(col1);

ALTER TABLE db_name.table_name DROP KEY k;
            

删除表

删除表是同步操作,语法如下:

DROP TABLE db_name.table_name;

清空表

清空表是同步操作,语法如下:

TRUNCATE TABLE db_name.table_name;

清空表的某个分区(二级分区)

清空表的某个分区是同步操作,语法如下:

TRUNCATE TABLE db_name.table_name PARTITION partition_name;

分区名(partition_name)必须是引擎内部统一分区值,可以通过如下的SQL语句获取某个表的所有分区(此SQL暂时无法获取分区信息,有需要请钉钉联系DBA):

select partition_name from information_schema.partitions where table_name = 'your_table_name' order by partition_name desc limit 100;

表分区(二级分区)清空的举例如下:

truncate table tbl partition 20170103
truncate table tbl partition 20170103,20170104,20170108
            

表元信息查看

desc table_name
show create table table_name
            

建表样例

建一个分区表

create table test (
     id bigint auto_increment,
     name varchar,
     value int,
     ts timestamp
)
DISTRIBUTE BY HASH(id)
INDEX_ALL='Y'
ENGINE='CSTORE'
            

建一个二级分区表

create table test2 (
     id bigint auto_increment,
     name varchar,
     value int,
     ts timestamp
)
DISTRIBUTE BY HASH(id)
PARTITION BY VALUE(YEARMONTHDAY(ts)) PARTITIONS 30
INDEX_ALL='Y'
ENGINE='CSTORE'
            

注意事项

  • 默认编码为UTF-8,相当于MySQL中的utf8mp4;暂不支持其他编码格式。
  • DDL不支持表和列的重命名。
  • DDL是online的,即在做DDL时无需锁表,查询不受影响。
  • 表名建议小写,默认忽略大小写,表名只接受大小写字母,数字和下划线,不支持中文
  • 单表支持的最大列数为4096。
  • 字段属性不支持on update current_timestamp
  • 表名长度最大为64字符,列名长度最大为64个字符。
  • 目前支持的最大表数目为单节点2000张,可随节点数目线性扩展。