功能介绍
在数据库中,分区是一种可以将表或索引数据分成多个逻辑部分的技术,可以提高查询效率、减少维护成本等。而二级分区则可以更加细粒度地对数据进行划分,如在一个分区内再次划分出多个子分区,可以提高数据的管理和查询效率。TDSQL-C MySQL 版支持创建 range 或 list 类型的二级分区。
支持版本
内核版本 TXSQL 8.0 3.1.15及以上。
适用场景
如需更加细粒度地对数据进行管理和查询,可以使用二级分区来提高查询的效率,如对大表进行分区。
注意事项
新增模板语法 SUBPARTITION TEMPLATE,因此每个子分区的定义必定是一致的。
每个子分区的名字是:一级分区名 $$ 模板二级分区名。
二级分区不支持 column_list。
truncate … with global index 暂时不支持 truncate 所有的分区,如果要 truncate 所有的分区,可以执行 truncate table。
包含全局索引的分区表,在 truncate partition 时跟官方保持一致,均不是 online ddl,但是包含全局索引的分区在 truncate partition 时需要维护全局索引,运行时间更长。建议使用 delete 的方式替代 truncate。
在模板二级分区名中不能存在 $$ 字符。
drop partition 需要重建全局索引,推荐多个 drop partition 合并成一个语句执行,减少维护全局索引的代价。
不推荐使用 truncate partition 操作,会阻塞 DML。
使用说明
1. 创建包含二级分区的表。
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name(create_definition,...)[table_options][partition_options]partition_options:PARTITION BY{ [LINEAR] HASH(expr)| [LINEAR] KEY [ALGORITHM={1 | 2}] (column_list)| RANGE{(expr) | COLUMNS(column_list)}| LIST{(expr) | COLUMNS(column_list)} }[PARTITIONS num][SUBPARTITION BY{ [LINEAR] HASH(expr)| [LINEAR] KEY [ALGORITHM={1 | 2}] (column_list) }[SUBPARTITIONS num]][SUBPARTITION BY{ RANGE{(expr)} -- range二级分区模板| LIST{(expr)} -- list二级分区模板SUBPARTITION TEMPLATE [(subpartition_definition [, subpartition_definition] ...)]} -- 子分区模板][(partition_definition [, partition_definition] ...)]subpartition_definition:SUBPARTITION logical_name[VALUES{ LESS THAN {(expr | value_list) | MAXVALUE} --Range子分区范围| IN (value_list)}] --List子分区范围[[STORAGE] ENGINE [=] engine_name][COMMENT [=] 'string' ][DATA DIRECTORY [=] 'data_dir'][INDEX DIRECTORY [=] 'index_dir'][MAX_ROWS [=] max_number_of_rows][MIN_ROWS [=] min_number_of_rows][TABLESPACE [=] tablespace_name]
例如:
CREATE TABLE `t1` (`id` int DEFAULT NULL,`purchased` int DEFAULT NULL,KEY `idx` (`id`,`purchased`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci/*!50100 PARTITION BY RANGE (`id`)SUBPARTITION BY RANGE (`purchased`)SUBPARTITION TEMPLATE(SUBPARTITION s0 VALUES LESS THAN (10) ENGINE = InnoDB,SUBPARTITION s1 VALUES LESS THAN (20) ENGINE = InnoDB)(PARTITION p0 VALUES LESS THAN (10) ENGINE = InnoDB,PARTITION p1 VALUES LESS THAN (20) ENGINE = InnoDB,PARTITION p2 VALUES LESS THAN (30) ENGINE = InnoDB) */;
2. ALTER TABLE 语法。
-- 二级分区的支持ALTER TABLE tbl_name[alter_option [, alter_option] ...][partition_options] [subpartition_options] -- 新增subpartition_optionssubpartition_options:subpartition_option [subpartition_option] ...subpartition_options: {MODIFY PARTITION partition_name TRUNCATE SUBPARTITION TEMPLATE subpartition_template_name; -- truncate 分区partition_name中模板名为subpartition_template_name的分区| TRUNCATE SUBPARTITION TEMPLATE subpartition_template_name -- truncate subpartition_template_name的二级分区| ADD SUBPARTITION TEMPLATE subpartition_definitions -- 新增subpartition_definitions模板| DROP SUBPARTITION TEMPLATE subpartition_template_name -- drop subpartition_template_name的二级分区}-- 一级分区DDLALTER TABLE t1 TRUNCATE p0 WITH GLOBAL INDEX; -- truncate p1分区(若存在子分区,则truncate下面所有子分区)
例如:
-- 二级分区 DDLALTER TABLE t1 MODIFY PARTITION p0 TRUNCATE SUBPARTITION TEMPLATE s1; -- truncate 二级分区p0_s1(一级分区p0,二级分区模板名s1)ALTER TABLE t1 TRUNCATE SUBPARTITION TEMPLATE s1; -- 所有分区后缀为_s1的子分区都将被truncateALTER TABLE t1 ADD SUBPARTITION TEMPLATE (SUBPARTITION s2 values in (1,2,3,4)); -- 所有分区将添加后缀为_s2的的子分区ALTER TABLE t1 DROP SUBPARTITION TEMPLATE s2; -- 所有分区将删除后缀为_s2的子分区;-- 一级分区 DDLALTER TABLE t1 ADD PARTITION (PARTITION p2 VALUES LESS THAN (20)); -- 添加分区,若t1是二级分区表,这里将默认使用模板来生成子分区ALTER TABLE t1 DROP PARTITION p1;ALTER TABLE t1 TRUNCATE p0 WITH GLOBAL INDEX; -- truncate p1分区(若存在子分区,则truncate下面所有子分区)
3. 支持新的时间函数。
tdsql_year,tdsql_month,tdsql_day,将时间转为 YYYY,YYYYMM,YYYYMMDD 的格式,支持的类型包含 DATE/DATETIME/TINYINT/SMALLINT/MEDIUMINT/BIGINT/CHAR/VARCHAR/VARBINARY/timestamp/binary。
当 tdsql_year,tdsql_month,tdsql_day 作为分区键中的函数时,不支持 binary、timestamp 类型。