RANGE 分區 將數據按**連續、不重疊的區間** 劃分,使用 `VALUES LESS THAN` 定義上邊界(含邊界值):
CREATE TABLE employees (
id INT NOT NULL,
store_id INT NOT NULL
)
PARTITION BY RANGE (store_id) (
PARTITION p0 VALUES LESS THAN (6), -- 1-5
PARTITION p1 VALUES LESS THAN (11), -- 6-10
PARTITION p2 VALUES LESS THAN (16), -- 11-15
PARTITION p3 VALUES LESS THAN MAXVALUE -- 16+
);
-- 按離職年份分區
CREATE TABLE employees (
id INT NOT NULL,
separated DATE NOT NULL DEFAULT '9999-12-31'
)
PARTITION BY RANGE (YEAR(separated)) (
PARTITION p0 VALUES LESS THAN (1991),
PARTITION p1 VALUES LESS THAN (1996),
PARTITION p2 VALUES LESS THAN (2001),
PARTITION p3 VALUES LESS THAN MAXVALUE
);
-- MySQL 8.0+ 推薦:RANGE COLUMNS 直接用日期列,無需 YEAR() 函數
PARTITION BY RANGE COLUMNS (separated) (
PARTITION p0 VALUES LESS THAN ('1991-01-01'),
PARTITION p1 VALUES LESS THAN ('1996-01-01'),
...
);
| 場景 | 操作 | 收益 |
|---|---|---|
| 定期清理舊數據 | `ALTER TABLE DROP PARTITION p0` | 元數據操作,毫秒級,無 undo/binlog,不影響業務 |
| 時間序列查詢 | `WHERE YEAR(separated)=2000` | 分區裁剪 只掃描 p2,避開 99% 數據 |
| 熱數據/冷數據分離存儲 | 不同分區指定 DATA DIRECTORY | 熱數據 SSD,冷數據 HDD,成本優化 |
EXPLAIN PARTITIONS
SELECT COUNT(*) FROM employees
WHERE YEAR(separated) = 2000 GROUP BY store_id;
-- 輸出 partitions 欄顯示 p2 → 裁剪生效
-- 新增 2020-2029 年分區
ALTER TABLE employees REORGANIZE PARTITION p3 INTO (
PARTITION p3 VALUES LESS THAN (2020),
PARTITION p4 VALUES LESS THAN (2030),
PARTITION p5 VALUES LESS THAN MAXVALUE
);
-- MySQL 8.0+ Online DDL 無鎖完成