分区与冷热分离

按时间或范围把大表拆分为分区,历史分区可归档到低成本存储;分区裁剪让查询只扫描相关分区,同时把批量维护(删除历史)变成分区级操作。

分区解决什么问题

表分区把一张大表在物理上拆成多块,逻辑上仍是一张表:按时间范围分区最常见,查询带分区键时优化器只扫描相关分区(分区裁剪),历史数据的删除从逐行 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)容易成为陷阱:如果滚动新建分区的任务失败,数据会静默写入默认分区,后续删除与归档都无法按预期执行。

易错点

  • 唯一索引未含分区键,约束无法建立,表结构要重新设计
  • 分区数量无上限增长,元数据管理开销上升,打开表与查询规划都变慢
  • 查询不带分区键,分区裁剪失效,扫描全部分区反而比不分区更慢
  • 滚动建分区任务无人监控,数据堆进默认分区,删除与归档失效
  • 把分区当分片使用,单实例写入瓶颈与连接数上限依旧存在

数据来源与参考

  • MySQL 8.0 Reference Manual:Partitioning
  • 《数据密集型应用系统设计》(Kleppmann)第 6 章
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌