在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 int
col8 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 col6
和col6 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张,可随节点数目线性扩展。