SQL分区表是把一张逻辑上的大表在物理上拆成多个分区来存储,数据库在查询时可以根据条件只访问需要的分区,从而减少数据扫描量并提升响应速度。设计得当的分区表能显著降低大表维护成本。

为什么需要分区表
当单表数据达到千万或亿级时,全表扫描会带来大量磁盘IO,索引维护也更慢。通过分区,热数据和小范围查询可以落在少数分区上,配合分区裁剪,查询性能会有明显提升。
常见分区设计方式
范围分区
按时间或数值区间拆分,最适合日志、订单等带时间字段的表。
列表分区
按某个枚举值分布,例如按地区或状态拆分。
哈希分区
对无明显范围的键做哈希散列,让数据均匀分布。
MySQL 范围分区示例
下面以按年月范围分区为例,展示建表语句:
CREATE TABLE order_log ( id BIGINT NOT NULL, user_id BIGINT, amount DECIMAL(10,2), created_at DATE ) PARTITION BY RANGE (YEAR(created_at)*100 + MONTH(created_at)) ( PARTITION p202401 VALUES LESS THAN (202402), PARTITION p202402 VALUES LESS THAN (202403), PARTITION p202403 VALUES LESS THAN (202404), PARTITION pmax VALUES LESS THAN MAXVALUE );
性能提升关键点
- 分区裁剪:查询条件包含分区键,数据库只扫对应分区。
- 本地索引:每个分区独立索引,维护开销更小。
- 冷热分离:旧分区可归档到慢存储。
注意事项
分区键应选择高频过滤字段,避免跨分区聚合。若使用 <input> 类似的标签名称在文档中说明,需要转义展示。函数调用如 count() 是普通调用,不是标签。
分区不是银弹,写入均匀性和查询模式要提前评估。
简单查询示例
-- 只访问 p202402 分区 SELECT user_id, amount FROM order_log WHERE created_at >= '2024-02-01' AND created_at < '2024-03-01';