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