昨天我们聊到了OceanBase的弹性扩缩容很多小伙伴在评论区问“既然能自动分摊数据那业务代码需要改吗”答案是完全不需要这正是OceanBase与传统“分库分表”中间件方案最大的区别。今天我们就来揭秘OceanBase是如何通过分区表Partition Table让海量数据变得透明且高效的。为什么不用分库分表传统分库分表如Sharding-JDBC需要业务层去适配分片规则代码侵入性强而且跨库JOIN、复杂子查询简直是灾难。而OceanBase在底层自动分片业务完全无感知不仅完美兼容MySQL语法还支持强一致的分布式事务性能接近单机。10分钟实操创建一个按月分区的订单表在OceanBase中我们通常推荐使用分区表来管理大表。以电商订单为例随着时间推移数据量会无限膨胀我们可以按时间进行Range分区CREATE TABLE t_order ( id BIGINT NOT NULL AUTO_INCREMENT COMMENT 主键ID, order_no VARCHAR(64) NOT NULL COMMENT 订单编号, total_amount DECIMAL(12,2) NOT NULL COMMENT 订单总金额, order_status TINYINT NOT NULL DEFAULT 0 COMMENT 订单状态, create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 创建时间, PRIMARY KEY (id, create_time), UNIQUE KEY uk_order_no (order_no, create_time) ) PARTITION BY RANGE (TO_DAYS(create_time)) ( PARTITION p202601 VALUES LESS THAN (TO_DAYS(2026-02-01)), PARTITION p202602 VALUES LESS THAN (TO_DAYS(2026-03-01)), PARTITION p202603 VALUES LESS THAN (TO_DAYS(2026-04-01)), PARTITION p_future VALUES LESS THAN MAXVALUE ); 设计避坑指南主键必须包含分区键在分布式数据库中为了保证全局唯一性和查询效率主键和唯一索引必须包含分区键如上述代码中的create_time。预留 MAXVALUE 分区一定要像代码中那样留一个p_future兜底分区否则当新数据超出时间范围时插入操作会直接报错。今日小结今天我们掌握了OceanBase处理海量数据的利器——分区表。它让业务代码无需关心数据到底存在哪台机器上同时为后续的在线扩容打下了完美的基础。 课后思考如果现在业务数据量继续暴增我们往集群里新加了两台物理服务器OBServer这些已经创建好的分区表数据OceanBase会怎么自动把它们“搬运”到新机器上提示这与底层的数据均衡机制有关。
每天10分钟学会OceanBase系列(Day 5):告别分库分表,用分区表驾驭海量数据
发布时间:2026/7/2 19:05:48
昨天我们聊到了OceanBase的弹性扩缩容很多小伙伴在评论区问“既然能自动分摊数据那业务代码需要改吗”答案是完全不需要这正是OceanBase与传统“分库分表”中间件方案最大的区别。今天我们就来揭秘OceanBase是如何通过分区表Partition Table让海量数据变得透明且高效的。为什么不用分库分表传统分库分表如Sharding-JDBC需要业务层去适配分片规则代码侵入性强而且跨库JOIN、复杂子查询简直是灾难。而OceanBase在底层自动分片业务完全无感知不仅完美兼容MySQL语法还支持强一致的分布式事务性能接近单机。10分钟实操创建一个按月分区的订单表在OceanBase中我们通常推荐使用分区表来管理大表。以电商订单为例随着时间推移数据量会无限膨胀我们可以按时间进行Range分区CREATE TABLE t_order ( id BIGINT NOT NULL AUTO_INCREMENT COMMENT 主键ID, order_no VARCHAR(64) NOT NULL COMMENT 订单编号, total_amount DECIMAL(12,2) NOT NULL COMMENT 订单总金额, order_status TINYINT NOT NULL DEFAULT 0 COMMENT 订单状态, create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 创建时间, PRIMARY KEY (id, create_time), UNIQUE KEY uk_order_no (order_no, create_time) ) PARTITION BY RANGE (TO_DAYS(create_time)) ( PARTITION p202601 VALUES LESS THAN (TO_DAYS(2026-02-01)), PARTITION p202602 VALUES LESS THAN (TO_DAYS(2026-03-01)), PARTITION p202603 VALUES LESS THAN (TO_DAYS(2026-04-01)), PARTITION p_future VALUES LESS THAN MAXVALUE ); 设计避坑指南主键必须包含分区键在分布式数据库中为了保证全局唯一性和查询效率主键和唯一索引必须包含分区键如上述代码中的create_time。预留 MAXVALUE 分区一定要像代码中那样留一个p_future兜底分区否则当新数据超出时间范围时插入操作会直接报错。今日小结今天我们掌握了OceanBase处理海量数据的利器——分区表。它让业务代码无需关心数据到底存在哪台机器上同时为后续的在线扩容打下了完美的基础。 课后思考如果现在业务数据量继续暴增我们往集群里新加了两台物理服务器OBServer这些已经创建好的分区表数据OceanBase会怎么自动把它们“搬运”到新机器上提示这与底层的数据均衡机制有关。