CREATE TABLE
更新时间:2024-04-23
本文主要介绍使用DDL语句进行建表的语法、子句、参数和基本方式。
语法
CREATE [SHADOW] TABLE [IF NOTEXISTS] tbl_name
(create_definition, ...)
[table_options]
[partition_options]
create_definition:
col_name column_definition
| mysql_create_definition
| [UNIQUE] GLOBAL INDEX index_name [index_type] (index_sharding_col_name,...)
[global_secondary_index_option]
[index_option] ...
# 分表子句
partition_options:
TBPARTITION BY tb_partition_algorithm
|global [TBPARTITIONS num]
[TBSUBPARTITION BY HASH(col_name)
[TBSUBPARTITIONS num]
]
tb_sharding_algorithm:
HASH([col_name])
| LIST([col_name])
| RANGE(col_name)
# 以下为MySQL DDL语法
index_sharding_col_name:
col_name [(length)] [ASC|DESC]
index_option:
KEY_BLOCK_SIZE [=] value| index_type
|WITH PARSER parser_name
| COMMENT 'string'
index_type:
USING {BTREE | HASH}
分布式表子句和参数
- TBPARTITION BYhash(partition_key):指定分表键和分库算法。
- TBPARTITIONS num(可选):每个库上的物理表数目(默认为1),如不分表,就不需要指定该字段。
单表
建一张单库单表,不做任何拆分。
CREATETABLE single_tbl(
id bigintnotnull auto_increment,
name varchar(30),
primary key(id)
);
查看逻辑表的节点拓扑,可以看出只在0分片创建了一张子表。
show topology from single_tbl;
+----+----------------------+----------------------+
| id | group_name | table_name |
+----+----------------------+----------------------+
| 0 | drdse48oscmt2b0_0000 | single_tbl__tablet_0 |
+----+----------------------+----------------------+
1 row in set (0.00 sec)
分布式表
GaiaDB-X 支持一级分区和二级分区方式拆分数据表,一级分区支持HASH/LIST/RANGE分区策略,二级分区支持HASH分区策略。
说明: 使用二级分区时,需要确保一级分区也采用HASH分区策略。
一级分区
使用哈希函数做拆分
建一张分布式表,拆分表的方式为按照ID列进行哈希,将逻辑表hash_tb拆分成4个物理子表,并将子表分布到多个分片中。
create table hash_tb(
id int,name varchar(30) DEFAULT NULL,
create_time datetime DEFAULT NULL,
primary key(id)
) tbpartition by hash(id) tbpartitions 4;
以2分片为例,执行以下命令查看子表的物理分布:
show topology from hash_tb;
+----+----------------------+-------------------+
| id | group_name | table_name |
+----+----------------------+-------------------+
| 0 | drdse48oscmt2b0_0000 | hash_tb__tablet_0 |
| 1 | drdse48oscmt2b0_0001 | hash_tb__tablet_1 |
| 2 | drdse48oscmt2b0_0000 | hash_tb__tablet_2 |
| 3 | drdse48oscmt2b0_0001 | hash_tb__tablet_3 |
+----+----------------------+-------------------+
4 rows in set (0.01 sec)
使用List方式做拆分
分布式 List 表:
CREATE TABLE tblist (
id INT NOT NULL,
store_id INT
) TBPARTITION BY LIST(store_id) TBPARTITIONS 4(
(1,5,6),
(2,7,8),
(3,9,10),
(4,11,12)
);
使用Range方式做拆分
分布式 Range 表:
CREATE TABLE range_tb (
id INT NOT NULL,
fname VARCHAR(30),
lname VARCHAR(30),
hired DATE NOT NULL DEFAULT '1970-01-01',
separated DATE NOT NULL DEFAULT '9999-12-31',
job_code INT NOT NULL,
store_id INT NOT NULL
)TBPARTITION BY RANGE (store_id) tbpartitions 3(
TBPARTITION p0 VALUES LESS THAN (6),
TBPARTITION p1 VALUES LESS THAN (11),
TBPARTITION p2 VALUES LESS THAN (21)
);
二级分区
二级分区仅支持 HAHS 分区策略,
CREATE TABLE hash_tb(
id int,sid int, name varchar(30) DEFAULT NULL,
create_time datetime DEFAULT NULL,
primary key(id)
)
TBPARTITION BY hash(id) TBPARTITIONS 4
TBSUBPARTITION BY HASH(sid) TBSUBPARTITIONS 2;
广播表创建
子句 TBPARTITION BY GLOBLE 用来指定创建广播表。广播表是指将这个表复制到每个分片上,在分片上通过同步机制实现数据一致,有秒级延迟。这样做的好处是可以将JOIN操作下推到底层的存储节点来避免跨库JOIN。
create table global_tbl(
province_id int(11) NOT NULL AUTO_INCREMENT,
province_name varchar(32) DEFAULT NULL,
PRIMARY KEY(province_id)
) tbpartition by global;
以2分片为例,执行以下命令查看广播表的物理分布:
show topology from global_tbl;
+----+----------------------+----------------------+
| id | group_name | table_name |
+----+----------------------+----------------------+
| 0 | drdse48oscmt2b0_0000 | global_tbl__tablet_0 |
| 1 | drdse48oscmt2b0_0001 | global_tbl__tablet_1 |
+----+----------------------+----------------------+
2 rows in set (0.00 sec)
其他MySQL建表属性
CREATE TABLE mysql_tbl(
id bigint not null,
name varchar(30),
primary key(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 tbpartition by hash(id) tbpartitions 3;