1. 背景
OceanBase 支持 range、list、hash 等多种类型的分区表,每个分区还能按照一定的规则进一步拆分为多个二级分区,可以显著提升数据库的查询性能、可管理性以及负载均衡效果。
试想这样的业务场景:一级分区为 hash 分区,二级分区为 range 分区,其中二级分区的分区键为时间类型。一旦需要插入的时间超过最大分区的上界,如果不能动态添加二级分区,就只能通过重建表的方式解决,为运维带来不少的麻烦。
因此,OceanBase 4.3.5 版本将提供 MySQL 租户添加二级分区的新语法,提升 OceanBase 分区管理的易用性和灵活性。
2. 语法说明
OceanBase 从 4.3.5 版本开始支持在 MySQL 租户下通过 ALTER TABLE 的方式为二级分区表添加二级分区,具体语法如下所示:
ALTER TABLE table_name MODIFY PARTITION partition_name
ADD SUBPARTITION (subpartition_option);
subpartition_option:
{SUBPARTITION subpartition_name VALUES LESS THAN range_partition_expr
[,SUBPARTITION subpartition_name VALUES LESS THAN range_partition_expr]... }
|{SUBPARTITION subpartition_name VALUES IN list_partition_expr
[,SUBPARTITION subpartition_name VALUES IN list_partition_expr]... }
各字段的说明如下表所示:
字段名称 | 描述 |
---|---|
table_name | 指定需要添加二级分区的表名 |
partition_name | 指定需要添加二级分区的一级分区名 |
subpartition_option | 待添加的二级分区定义 |
subpartition_name | 待添加的二级分区名 |
range_partition_expr | range 分区表达式 |
list_partition_expr | list 分区表达式 |
使用限制
目前,OceanBase MySQL 模式支持添加 range、range columns、list 和 list columns 二级分区,暂不支持添加 hash 和 key 二级分区。暂不支持在一条 SQL 中跨一级分区添加多个二级分区,仅能在同一个一级分区下新增多个二级分区。对于模板二级分区表,暂不支持通过修改二级分区模板的方式批量修改二级分区。
3. 功能实践
下面以 range + range 组合二级分区表为例,展示添加二级分区的实际操作与效果。
CREATE TABLE range_range_table (c1 INT, c2 INT, c3 INT)
PARTITION BY RANGE(c1)
SUBPARTITION BY RANGE(c2)
SUBPARTITION TEMPLATE
(
SUBPARTITION p0 VALUES LESS THAN (2023),
SUBPARTITION p1 VALUES LESS THAN (2024)
)
(
PARTITION p0 VALUES LESS THAN (100),
PARTITION p1 VALUES LESS THAN (200)
);
场景一:添加二级分区
1. 查看当前表的分区信息
SELECT partition_name, subpartition_name FROM OCEANBASE.DBA_TAB_SUBPARTITIONS WHERE table_name = 'range_range_table';
+----------------+-------------------+
| partition_name | subpartition_name |
+----------------+-------------------+
| p0 | p0sp0 |
| p0 | p0sp1 |
| p1 | p1sp0 |
| p1 | p1sp1 |
+----------------+-------------------+
2. 尝试 insert,由于对应二级分区不存在,insert 失败
INSERT INTO range_range_table VALUES (50, 2024, 0);
ERROR 1526 (HY000): Table has no partition for value
3. 新增二级分区,支持在同一一级分区下同时新增多个二级分区
ALTER TABLE range_range_table MODIFY PARTITION p0 ADD SUBPARTITION
(
SUBPARTITION p0sp2 VALUES LESS THAN (2025),
SUBPARTITION p0sp3 VALUES LESS THAN (2026)
);
4. 查看当前表的分区信息
SELECT partition_name, subpartition_name FROM OCEANBASE.DBA_TAB_SUBPARTITIONS WHERE table_name = 'range_range_table';
+----------------+-------------------+
| partition_name | subpartition_name |
+----------------+-------------------+
| p0 | p0sp0 |
| p0 | p0sp1 |
| p0 | p0sp2 |
| p0 | p0sp3 |
| p1 | p1sp0 |
| p1 | p1sp1 |
+----------------+-------------------+
5. 再次 insert,执行成功
INSERT INTO range_range_table VALUES (50, 2024, 0);
场景二:新增的二级分区与已有一级分区或二级分区重名时会报错
ALTER TABLE range_range_table MODIFY PARTITION p0 ADD SUBPARTITION
(
SUBPARTITION p0 VALUES LESS THAN (2027)
);
ERROR 5867 (HY000): Duplicate partition name p0
ALTER TABLE range_range_table MODIFY PARTITION p0 ADD SUBPARTITION
(
SUBPARTITION p0sp0 VALUES LESS THAN (2027)
);
ERROR 5867 (HY000): Duplicate partition name p0sp0
4. 小结
OceanBase MySQL 租户支持添加二级分区将在 4.3.5 版本发布,为 OceanBase 的分区管理带来更多的灵活与便利。需要注意的是,目前为止原生 MySQL 暂不支持添加二级分区。OceanBase 将在兼容原生 MySQL 的基础上,持续对 MySQL 模式进行能力增强,打造更好用的数据库。
原文来自 OceanBase 社区博客《OceanBase v4.3.5 特性解读:MySQL 租户支持添加二级分区》。