分区解决什么问题
表分区把一张大表在物理上拆成多块,逻辑上仍是一张表:按时间范围分区最常见,查询带分区键时优化器只扫描相关分区(分区裁剪),历史数据的删除从逐行 DELETE 变成整体删除分区,归档也能按分区搬走。它解决的是“大表维护与查询裁剪”,不是“单机容量无限”——分区仍在同一个数据库实例里,超大规模还需要分片。
基本信息
| 策略 | 按时间范围分区最常见;哈希分区可用均衡写入 |
|---|---|
| 收益 | 查询裁剪、历史归档、批量清理更快 |
| 注意 | 唯一约束需包含分区键;跨分区查询成本仍在 |
| 维护 | 按周期滚动新建分区,避免数据堆在默认分区 |
典型使用场景
- 订单与流水表:按月度分区,历史分区归档后查询只在近期分区
- 日志与事件表:按天分区,过期数据直接删除分区
- 冷热分离:热数据在近期分区,冷数据压缩归档到低成本存储
- 批量维护:重建索引或统计信息按分区进行,减少锁范围
- 数据导入:按分区并发导入,缩短批量导入窗口
按时间分区示例(MySQL 语法示意)
按时间分区示例(MySQL 语法示意)
ALTER TABLE orders PARTITION BY RANGE (TO_DAYS(created_at)) (
PARTITION p202601 VALUES LESS THAN (TO_DAYS('2026-02-01')),
PARTITION p202602 VALUES LESS THAN (TO_DAYS('2026-03-01')),
PARTITION pmax VALUES LESS THAN MAXVALUE
);
-- 归档历史:整体删除分区,避免逐行 DELETE
ALTER TABLE orders DROP PARTITION p202501;分区策略对照
| 策略 | 适用 | 注意 |
|---|---|---|
| 范围分区(按时间) | 时间序列数据,查询按时间窗口 | 必须有滚动新建分区与归档任务 |
| 哈希分区 | 无明显时间特征、需要均衡写入 | 范围查询无法裁剪,只对等值查询有效 |
| 列表分区 | 按枚举维度切分,如区域或租户分组 | 取值集合变化时要调整分区定义 |
| 复合分区 | 先按范围再按哈希,兼顾裁剪与均衡 | 分区数量增长快,元数据开销要评估 |
使用要点
- 分区键要出现在高频查询条件里,才能触发分区裁剪,否则分区只增加管理成本
- 按周期滚动新建分区并归档旧分区,避免数据堆在默认分区
- 唯一约束(含主键)必须包含分区键,设计表时先确认这一点
- 分区调整后校验统计信息与自动维护任务的执行情况
- 跨分区查询要评估:无分区键的查询会扫描所有分区,比不分区更慢
分区不是分库:单库分区上限与维护成本要评估,超大规模需要结合分片方案;分区解决的是单实例内的大表管理问题。
默认分区(MAXVALUE)容易成为陷阱:如果滚动新建分区的任务失败,数据会静默写入默认分区,后续删除与归档都无法按预期执行。