TDSQL MySQL 版目前支持 Range 和 List 两种格式的二级分区,具体建表语法和 MySQL 分区语法类似。
二级分区语法
一级 Hash,二级 List 分区示例如下:
MySQL [test]> CREATE TABLE customers_1 (first_name VARCHAR(25) key,last_name VARCHAR(25),street_1 VARCHAR(30),street_2 VARCHAR(30),city VARCHAR(15),renewal DATE) shardkey=first_namePARTITION BY LIST (city) (PARTITION pRegion_1 VALUES IN('Beijing', 'Tianjin', 'Shanghai'),PARTITION pRegion_2 VALUES IN('Chongqing', 'Wulumuqi', 'Dalian'),PARTITION pRegion_3 VALUES IN('Suzhou', 'Hangzhou', 'Xiamen'),PARTITION pRegion_4 VALUES IN('Shenzhen', 'Guangzhou', 'Chengdu'));
一级 Range,二级 List 创建语法如下:
MySQL [test]> CREATE TABLE tb_sub_r_l (id int(11) NOT NULL,order_id bigint NOT NULL,PRIMARY KEY (id,order_id))PARTITION BY list(order_id)(PARTITION p0 VALUES in (2121122),PARTITION p1 VALUES in (38937383))TDSQL_DISTRIBUTED BY RANGE(id) (s1 values less than (100),s2 values less than (1000));Query OK, 0 rows affected, 1 warning (0.35 sec)
若使用 month 函数,则查询插入对应的值格式应为20160101,必须满足时间戳的格式要求:
CREATE TABLE employees_int (id INT key NOT NULL,fname VARCHAR(30),lname VARCHAR(30),hired date,separated DATE NOT NULL DEFAULT '9999-12-31',job_code INT,store_id INT)shardkey=idPARTITION BY RANGE ( month(hired) ) (PARTITION p0 VALUES LESS THAN (199102),PARTITION p1 VALUES LESS THAN (199603),PARTITION p2 VALUES LESS THAN (200101));
Range 支持类型
DATE,DATETIME,TIMESTAMP。
TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT。
支持 year、month、day 函数,此时传入的值转换为年月日,然后和分表信息进行对比。
List 支持类型
DATE、DATETIME、TIMESTAMP。
支持年月日函数。
TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT、VARCHAR。
警告:
建议不要使用 TIMESTAMP 类型作为分区键,因为 TIMESTAMP 受到时区的影响,同时只能使用到2038年。
如果分区键是 char 或者 varchar 类型,建议长度不超255。
year、month、day 函数的输入值必须满足时间戳的格式要求。例如: YYYYMMDD, YYMMDDHHMMSS, YYYYMMDDHHMMSS,YY-MM-DD, YYYY-MM-DD, YY-MM-DD HH.MM.SS, YYYYMMDDTHHMMS。
注意:
分区使用小于符号“<”,如果要存储当年数据(例如,2017),需要创建小于往后一年(<2018)的分区,用户只需创建到当前的时间分区。
TDSQL 会自动增加后续分区,如果是月则默认往后自动增加2个月范围的分区,如果是年则默认往后自动增加2年范围的分区,如果是天则默认往后自动增加5天范围的分区。
用户自行创建的二级分区表命名尽量用 p0,p1,…… pN 这样的命名格式。如需个性化定义需要注意命名规范:注意 p_auto_202407 分区对应 RANGE 范围为202407-202408。否则无法使用 TDSQL 自动创建分区功能。
使用场景和方法建议
建议业务尽量都使用一级分区表。
使用前根据业务长期场景合理设计表结构,二级分区适用于表结构创建后长期都不需要 DDL 变更、需要定期进行分区数据清理和裁剪的场景,如日志流水表。
合理设计二级分区的粒度,二级分区的粒度建议不要划分得太细,避免产生过多的二级子表。如流水表按月进行二级分区,而不是按天/小时进行分区,避免文件系统上数据文件个数过多。
在对二级分区表进行 SQL 查询时,查询条件需要尽量带上一级分区和二级分区的键值,避免执行查询时需要打开很多的数据文件进行搜索。
在对二级分区表进行 join 查询时,如果查询条件未能带上一级分区和二级分区的键值,操作性能效率较低,建议不要使用。
表的主键或唯一索引需要包含分区键,否则无法保证数据唯一性。