| 類型 | 子類型 | 分區鍵要求 |
|---|---|---|
| RANGE | 原生 / COLUMNS | 整數 / 任意列 (COLUMNS) |
| LIST | 原生 / COLUMNS | 整數 / 任意列 (COLUMNS) |
| HASH | 原生 / LINEAR | 整數 |
| KEY | 原生 / LINEAR | 列 (隱式 MD5) |
test(id, hiredate DATETIME),100 萬行hiredate 僅覆蓋 10 天:2015-12-01 ~ 2015-12-10,每天約 10 萬行CREATE TABLE range_datetime (
id INT, hiredate DATETIME
) PARTITION BY RANGE (TO_DAYS(hiredate)) (
PARTITION p1 VALUES LESS THAN (TO_DAYS('20151202')),
PARTITION p2 VALUES LESS THAN (TO_DAYS('20151203')),
...
PARTITION p10 VALUES LESS THAN (TO_DAYS('20151211'))
);
分區裁剪驗證:
EXPLAIN PARTITIONS SELECT * FROM range_datetime WHERE hiredate >= '20151207124503' AND hiredate <= '20151210111230'; -- partitions: p7,p8,p9,p10 ✅ 裁剪生效
CREATE TABLE range_columns (
id INT, hiredate DATETIME
) PARTITION BY RANGE COLUMNS(hiredate) (
PARTITION p1 VALUES LESS THAN ('20151202'),
PARTITION p2 VALUES LESS THAN ('20151203'),
...
PARTITION p10 VALUES LESS THAN ('20151211')
);
優勢: 無需函數轉換、直接支援 DATETIME/DATE/字符串列、多列分區、元組比較。
分區裁剪驗證: 同樣得到 p7,p8,p9,p10 ✅
CREATE TABLE hash_datetime ( id INT, hiredate DATETIME ) PARTITION BY HASH(TO_DAYS(hiredate)) PARTITIONS 10;
分區裁剪驗證:
EXPLAIN PARTITIONS SELECT * FROM hash_datetime WHERE hiredate >= '20151207124503' AND hiredate <= '20151210111230'; -- partitions: p0,p1,p2,p3,p4,p5,p6,p7,p8,p9 ❌ 全分區掃描,無裁剪
HASH 分區對範圍查詢**無法裁剪**,僅適合等值點查詢或負載均衡寫入場景。
MySQL 限制:TIMESTAMP 分區**只能**使用UNIX_TIMESTAMP(),其他函數報錯ERROR 1486。
CREATE TABLE range_timestamp (
id INT, hiredate TIMESTAMP
) PARTITION BY RANGE (UNIX_TIMESTAMP(hiredate)) (
PARTITION p1 VALUES LESS THAN (UNIX_TIMESTAMP('2015-12-02 00:00:00')),
...
PARTITION p10 VALUES LESS THAN (UNIX_TIMESTAMP('2015-12-11 00:00:00'))
);
分區裁剪驗證: 同樣得到 p7,p8,p9,p10 ✅
| 場景 | 推薦方案 | 理由 |
|---|---|---|
| DATETIME/DATE 範圍查詢、按天/月分區 | RANGE COLUMNS | 語法簡潔、無函數依賴、支援多列、裁剪完美 |
| 舊版本 (≤5.6) 不支援 COLUMNS | RANGE + TO_DAYS() | 兼容性好,5.7+ 新增 TO_SECONDS() 支援秒級 |
| TIMESTAMP 列 | RANGE + UNIX_TIMESTAMP() | **唯一合法函數**,其他函數報錯 |
| 均勻寫入負載、無範圍查詢 | HASH / KEY | 無裁剪優勢,但寫入分散 |
個人強烈傾向 RANGE COLUMNS:語義清晰、維護簡單、效能最優。LIST 分區雖可實現同樣按天分區,但需枚舉每天值,極不靈活。