RANGE分区是按列值连续范围将表划分为多个分区,适用于时间或数字字段;要求分区列类型为数值或日期、范围不重叠且连续覆盖,插入时自动路由至匹配分区。
SQL的RANGE分区是按列值的连续范围将表数据划分为多个分区,每个分区对应一个值区间,常用于时间字段(如日期)或数字主键的归档与查询优化。
RANGE分区要求分区列必须是数值型或日期型,且各分区范围不能重叠、必须连续覆盖(或明确指定MAXVALUE作为兜底)。MySQL、PostgreSQL(通过表继承模拟)、Oracle等主流数据库均支持,但语法细节略有差异。核心逻辑是:当插入一条记录时,数据库根据分区列的值自动将其路由到匹配的分区中。
必须满足以下条件:
R TABLE ... PARTITION BY以订单表orders为例,按订单创建时间(order_date)做月度分区:
CREATE TABLE orders ( id BIGINT PRIMARY KEY, order_no VARCHAR(32), amount DECIMAL(10,2), order_date DATE ) PARTITION BY RANGE (YEAR(order_date) * 100 + MONTH(order_date)) ( PARTITION p_202501 VALUES LESS THAN (202502), PARTITION p_202502 VALUES LESS THAN (202503), PARTITION p_202503 VALUES LESS THAN (202504), PARTITION p_202504 VALUES LESS THAN (202505), PARTITION p_future VALUES LESS THAN MAXVALUE );
说明:这里用YEAR(date)*100+MONTH(date)生成形如202501的整数,便于RANGE分区;查询WHERE order_date BETWEEN '2025-02-01' AND '2025-02-28'时,优化器可自动裁剪到p_202502分区,大幅减少扫描量。
容易踩的坑:
order_date仍建议加普通索引或前缀索引ALTER TABLE orders DROP PARTITION p_202501,比DELETE更快且不锁全表基本上就这些。RANGE分区不是万能的,但对时间序列类大表的冷热分离和快速归档非常实用。