【特性尝鲜】OceanBase v4.3.5 特性解读 —— MySQL 租户支持添加二级分区

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 租户支持添加二级分区》

7 个赞

社区论坛的培训中心板块,今日开始启动【DBA 实战营】活动。

第一期内容恰巧是 “分区表的使用技巧”,顺带也在这里推荐给大家。欢迎大家来参加分区表的在线体验,获取积分和抽奖福利!

《DBA 实战营》在线课程 传送门

《分区表的使用》在线体验 传送门

5 个赞

二级分区终于有了,分区表又站起来了。什么时候出分区索引呢

6 个赞

感觉又开始慢慢对标oracle数据库了

3 个赞

分区索引指啥呀?

是说分区方式独立于主表的索引吗?如果是的话,这种索引在 OB 里叫 global 索引,已经支持了。详见DBA 实战营的前置课程: DBA从入门到实践 的 6-4 小节,有视频和文档,以及课后练习哈。

4 个赞

哈哈,确实感觉 OB 在 MySQL 模式的租户下加入了很多 MySQL 没有的扩展功能,例如全局索引、回收站、表组、数组类型等等等等~

3 个赞

功能越来越强大了

3 个赞

很棒的解读

1 个赞

local partitonal index .分区本地索引。每个分区可以有独立的索引。

1 个赞

哈哈 这样学起来才轻松呀

1 个赞

好功能,越来越完善

1 个赞

感觉又开始慢慢对标oracle数据库了

1 个赞

感谢分享

1 个赞

功能越来越强大了,谢谢讲解