RANGE分区是按列值连续范围将表划分为多个分区,适用于时间或数字字段;要求分区列类型为数值或日期、范围不重叠且连续覆盖,插入时自动路由至匹配分区。

SQL的RANGE分区是按列值的连续范围将表数据划分为多个分区,每个分区对应一个值区间,常用于时间字段(如日期)或数字主键的归档与查询优化。
RANGE分区要求分区列必须是数值型或日期型,且各分区范围不能重叠、必须连续覆盖(或明确指定MAXVALUE作为兜底)。MySQL、PostgreSQL(通过表继承模拟)、Oracle等主流数据库均支持,但语法细节略有差异。核心逻辑是:当插入一条记录时,数据库根据分区列的值自动将其路由到匹配的分区中。
必须满足以下条件:
以订单表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_202301 VALUES LESS THAN (202302), PARTITION p_202302 VALUES LESS THAN (202303), PARTITION p_202303 VALUES LESS THAN (202304), PARTITION p_202304 VALUES LESS THAN (202305), PARTITION p_future VALUES LESS THAN MAXVALUE );
说明:这里用YEAR(date)*100+MONTH(date)生成形如202301的整数,便于RANGE分区;查询WHERE order_date BETWEEN '2023-02-01' AND '2023-02-28'时,优化器可自动裁剪到p_202302分区,大幅减少扫描量。
容易踩的坑:
order_date仍建议加普通索引或前缀索引ALTER TABLE orders DROP PARTITION p_202301,比DELETE更快且不锁全表基本上就这些。RANGE分区不是万能的,但对时间序列类大表的冷热分离和快速归档非常实用。
以上就是SQL按范围分区详细说明_SQL RANGE分区示例的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号