SQL分区表通过将大表的数据按规则拆分到不同的物理存储单元中,能够提升查询效率、简化数据维护流程。目前主流的关系型数据库支持RANGE、LIST、HASH、KEY四种基础分区类型,每种类型的设计逻辑不同,适用的业务场景也存在明显差异。

RANGE分区适用场景
RANGE分区是按照某个列的取值范围对数据进行拆分,每个分区对应一个连续的范围区间。这种分区类型最适合具有明显连续范围特征的数据,尤其是时间类、数值类有序数据。
最典型的业务场景是日志表、订单流水表这类按时间递增生成的数据表。比如电商平台的订单表,通常按订单创建时间查询最近几个月的数据,使用RANGE分区按月份拆分数据后,查询指定时间范围的订单时,数据库只需要扫描对应月份的分区,不需要全表遍历。
以下是MySQL中创建RANGE分区订单表的示例代码:
-- 创建按订单创建时间RANGE分区的订单表
CREATE TABLE order_info (
order_id BIGINT PRIMARY KEY,
user_id BIGINT NOT NULL,
order_amount DECIMAL(10,2) NOT NULL,
create_time DATE NOT NULL
)
PARTITION BY RANGE (YEAR(create_time) * 100 + MONTH(create_time)) (
PARTITION p202401 VALUES LESS THAN (202402),
PARTITION p202402 VALUES LESS THAN (202403),
PARTITION p202403 VALUES LESS THAN (202404),
PARTITION p_max VALUES LESS THAN MAXVALUE
);
LIST分区适用场景
LIST分区是按照某个列的离散取值集合对数据进行拆分,每个分区对应一组固定的枚举值。这种分区类型适合列的取值是有限个离散选项,且查询经常按这些枚举值过滤的场景。
常见的业务场景包括地区维度表、状态维度表。比如全国用户表,如果查询经常按省份筛选用户,就可以使用LIST分区,把同一个省份的用户放到同一个分区中。另外订单状态表也适合LIST分区,订单状态通常是待支付、已支付、已发货、已完成、已取消这几个固定值,按状态分区后,查询特定状态的订单时只需要扫描对应分区。
以下是创建LIST分区用户表的示例代码:
-- 创建按省份LIST分区的用户表
CREATE TABLE user_info (
user_id BIGINT PRIMARY KEY,
user_name VARCHAR(50) NOT NULL,
province VARCHAR(20) NOT NULL,
register_time DATE NOT NULL
)
PARTITION BY LIST (province) (
PARTITION p_beijing VALUES IN ('北京'),
PARTITION p_shanghai VALUES IN ('上海'),
PARTITION p_guangdong VALUES IN ('广东'),
PARTITION p_other VALUES IN ('浙江','江苏','四川','湖北')
);
HASH分区适用场景
HASH分区是对指定列的哈希值取模,将数据均匀分配到各个分区中,分区的数量和取模的规则由用户定义。这种分区类型适合没有明显范围或枚举特征,且希望数据均匀分布到多个分区,分散IO压力的场景。
典型场景是用户行为记录表、随机生成的流水表。比如社交平台的用户动态表,动态ID是随机生成的,没有时间或地域的明显聚集特征,使用HASH分区可以将数据均匀拆分到多个分区,避免单个分区数据量过大。另外如果查询经常按主键或者哈希列做等值查询,HASH分区也能快速定位到对应的分区。
以下是创建HASH分区动态表的示例代码:
-- 创建按用户IDHASH分区的用户动态表,分为4个分区
CREATE TABLE user_post (
post_id BIGINT PRIMARY KEY,
user_id BIGINT NOT NULL,
post_content TEXT NOT NULL,
publish_time DATETIME NOT NULL
)
PARTITION BY HASH (user_id)
PARTITIONS 4;
KEY分区适用场景
KEY分区和HASH分区逻辑类似,也是通过哈希计算分配数据,但KEY分区使用数据库内置的哈希函数,不需要用户指定哈希规则,且支持除了整数之外的其他类型列作为分区键。这种分区类型适合分区键不是整数类型,且需要数据均匀分布的场景。
常见场景是使用字符串类型作为分区键的表,比如商品表,商品编号是字符串格式,使用KEY分区可以基于商品编号的内置哈希值拆分数据。另外如果不确定使用哪种哈希规则,KEY分区也是更稳妥的选择,因为数据库内置的哈希函数已经经过充分优化,数据分布均匀性更有保障。
以下是创建KEY分区商品表的示例代码:
-- 创建按商品编号KEY分区的商品表,分为6个分区
CREATE TABLE product_info (
product_id VARCHAR(32) PRIMARY KEY,
product_name VARCHAR(100) NOT NULL,
price DECIMAL(10,2) NOT NULL,
stock INT NOT NULL
)
PARTITION BY KEY (product_id)
PARTITIONS 6;
分区类型选型核心判断依据
实际选型时可以参考以下几个维度判断:
- 如果数据有明确的连续范围特征,且查询经常按范围过滤,优先选择RANGE分区
- 如果数据列是有限个离散枚举值,且查询经常按枚举值过滤,优先选择LIST分区
- 如果数据没有明显特征,需要均匀分布数据,且分区键是整数类型,可选择HASH分区
- 如果分区键是非整数类型,或者希望使用数据库内置哈希规则,可选择KEY分区
需要注意的是,分区键必须是主键或者唯一索引的一部分,否则创建分区表会失败。同时分区数量也不是越多越好,过多的分区会增加元数据管理开销,反而可能降低性能,一般根据数据量和服务器资源合理设置即可。
SQL_partitioningRANGE分区LIST分区HASH分区KEY分区修改时间:2026-06-24 04:42:31