按**連續、不重疊的區間**劃分資料。每個分區定義 VALUES LESS THAN (值),順序遞增,類似 switch-case。區間上限**不包含**該值(嚴格小於)。
CREATE TABLE employees (
id INT NOT NULL,
fname VARCHAR(30),
lname VARCHAR(30),
hired DATE NOT NULL DEFAULT '1970-01-01',
separated DATE NOT NULL DEFAULT '9999-12-31',
job_code INT NOT NULL,
store_id INT NOT NULL
)
PARTITION BY RANGE (store_id) (
PARTITION p0 VALUES LESS THAN (6),
PARTITION p1 VALUES LESS THAN (11),
PARTITION p2 VALUES LESS THAN (16),
PARTITION p3 VALUES LESS THAN (21)
);
店編 1-5 → p0,6-10 → p1,11-15 → p2,16-20 → p3。
PARTITION BY RANGE (store_id) (
PARTITION p0 VALUES LESS THAN (6),
PARTITION p1 VALUES LESS THAN (11),
PARTITION p2 VALUES LESS THAN (16),
PARTITION p3 VALUES LESS THAN MAXVALUE -- 存放 ≥16 所有值
);
未來擴充新店只需 ALTER TABLE ... REORGANIZE PARTITION 切分 p3。
PARTITION BY RANGE (job_code) (
PARTITION p0 VALUES LESS THAN (100), -- 兩位數:店內工
PARTITION p1 VALUES LESS THAN (1000), -- 三位數:辦公/支援
PARTITION p2 VALUES LESS THAN (10000) -- 四位數:管理層
);
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
);
離職年份 1991 前 → p0,1991-1995 → p1,2000 後 → p3。
NOT NULL,避免 NULL 無法比較導致插入失敗。YEAR()、TO_DAYS()、TO_SECONDS()(5.5+)、UNIX_TIMESTAMP()(5.5+)等確定性函數。ALTER TABLE employees DROP PARTITION p0; 秒級釋放空間,避免 DELETE 全表掃描與碎片。EXPLAIN PARTITIONS 可見 partitions=p2。DATA DIRECTORY/INDEX DIRECTORY 掛載不同磁碟(SSD/HDD 分層)。MAXVALUE → ERROR 1526 (HY000): Table has no partition for value。UPDATE employees SET store_id=20 WHERE id=1),會觸發 DELETE + INSERT 開銷大,慎用。