MySQL 5.1+ 以插件形式引入分區功能,5.6 後更穩定。本文系統整理分區支援檢查、五大類型語法、COLUMNS 分區、子分區、索引限制、分區修剪原理、維護優勢與避坑指南。
-- 5.6 前
SHOW VARIABLES LIKE '%partition%'; -- have_partition_engine=YES
-- 5.6 後
SHOW PLUGINS; -- partition | ACTIVE | STORAGE ENGINE
| 類型 | 關鍵字 | 適用場景 | 範例 |
|---|---|---|---|
| RANGE | PARTITION BY RANGE(expr) + VALUES LESS THAN | 時間、ID 連續區間 | 按年分區:PARTITION BY RANGE(YEAR(credate)) |
| LIST | PARTITION BY LIST(expr) + VALUES IN | 性別、狀態、地區等離散值 | PARTITION BY LIST(sex) VALUES IN(1), VALUES IN(2) |
| HASH | PARTITION BY HASH(expr) + PARTITIONS N | 均勻分佈、無明確範圍 | PARTITION BY HASH(perid) PARTITIONS 8 |
| LINEAR HASH | PARTITION BY LINEAR HASH(expr) | 大量資料更優修剪 | 同上,加 LINEAR 關鍵字 |
| KEY | PARTITION BY KEY(col) + PARTITIONS N | MySQL 內建哈希、支援非整數 | PARTITION BY KEY(perid) PARTITIONS 8 |
直接使用 DATE、DATETIME、CHAR、VARCHAR 等非整數型別分區,無需轉換函數:
PARTITION BY RANGE COLUMNS (credate) (
PARTITION p20151 VALUES LESS THAN ('2015-04-01'),
PARTITION p20152 VALUES LESS THAN ('2015-07-01'),
PARTITION partlog VALUES LESS THAN MAXVALUE
);
PARTITION BY RANGE (f_id)
SUBPARTITION BY HASH(f_id) SUBPARTITIONS 2 (
PARTITION p0 VALUES LESS THAN (10),
PARTITION p1 VALUES LESS THAN (20)
);
可指定每個子分區的 DATA/INDEX DIRECTORY 實現多磁碟分離。
ERROR 1503: A PRIMARY KEY MUST INCLUDE ALL COLUMNS IN THE TABLE'S PARTITIONING FUNCTIONNOT NULLADD PARTITION 僅支援 MAXVALUE 之後優化器根據 WHERE 條件中的分區鍵,推斷僅需掃描的分區集合。務必在 WHERE 子句包含分區鍵,即使看似多餘,否則退化為全表掃描。
EXPLAIN PARTITIONS 驗證修剪生效官方文檔:MySQL Partitioning