二级分区

最近更新时间:2024-10-18 16:31:52

我的收藏

功能介绍

在数据库中,分区是一种可以将表或索引数据分成多个逻辑部分的技术,可以提高查询效率、减少维护成本等。而二级分区则可以更加细粒度地对数据进行划分,如在一个分区内再次划分出多个子分区,可以提高数据的管理和查询效率。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_options

subpartition_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的二级分区
}

-- 一级分区DDL
ALTER TABLE t1 TRUNCATE p0 WITH GLOBAL INDEX; -- truncate p1分区(若存在子分区,则truncate下面所有子分区)
例如:
-- 二级分区 DDL
ALTER TABLE t1 MODIFY PARTITION p0 TRUNCATE SUBPARTITION TEMPLATE s1; -- truncate 二级分区p0_s1(一级分区p0,二级分区模板名s1)
ALTER TABLE t1 TRUNCATE SUBPARTITION TEMPLATE s1; -- 所有分区后缀为_s1的子分区都将被truncate
ALTER TABLE t1 ADD SUBPARTITION TEMPLATE (SUBPARTITION s2 values in (1,2,3,4)); -- 所有分区将添加后缀为_s2的的子分区
ALTER TABLE t1 DROP SUBPARTITION TEMPLATE s2; -- 所有分区将删除后缀为_s2的子分区;

-- 一级分区 DDL
ALTER 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 类型。