云数据库 MySQL 二级分区

在 MySQL 数据库中,分区是一种可以将表或索引数据分成多个逻辑部分的技术,可以提高查询效率、减少维护成本等。而二级分区则可以更加细粒度地对数据进行划分,在一个分区内再次划分出多个子分区,可以提高数据的管理和查询效率。云数据库 MySQL 支持创建 range 或 list 类型的二级分区。

相关产品
云数据库 MySQL 产品页,含版本规格、价格与购买入口。

一、支持版本

内核版本 MySQL8.0 20230630及以上。

二、适用场景

如需更加细粒度地对数据进行管理和查询,可以使用二级分区来提高查询的效率,如对大表进行分区。

三、注意事项

·新增模板语法 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 语法。

— 二级分区 DDLALTER 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 类型。

赞 (0)
上一篇 4天前
下一篇 4天前