核心原理
KEY 分區 類似 HASH 分區,但哈希函數由 MySQL 服務器內部提供:
- MySQL Cluster (NDB) 使用 `MD5()`。
- 其他存儲引擎 (InnoDB/MyISAM) 使用基於 `PASSWORD()` 同源的內部哈希算法。
- **關鍵差異:** KEY 分區**只接受列名列表**,不接受表達式;HASH 分區接受表達式。
基本語法
CREATE TABLE tk (
col1 INT NOT NULL,
col2 CHAR(5),
col3 DATE
)
PARTITION BY KEY (col1)
PARTITIONS 3;
LINEAR KEY:2 的冪次分區算法
CREATE TABLE tk (
col1 INT NOT NULL
)
PARTITION BY LINEAR KEY (col1)
PARTITIONS 3;
- 標準 KEY/HASH:取模算法 `MOD(hash, partitions)`。
- LINEAR KEY:2 的冪次算法(與 `LINEAR HASH` 同源),分區分佈更均勻,`ADD PARTITION`/`DROP PARTITION` 時數據移動更少。
- **適用場景:** 分區數較大、頻繁調整分區數量的場景。
KEY vs HASH 詳細對比
| 維度 | KEY 分區 | HASH 分區 |
| 哈希函數 | 服務器內部 (MD5/PASSWORD 系) | 用戶定義表達式 |
| 分區鍵 | 僅列名列表 (一或多列) | 任意有效 SQL 表達式 |
| 非整數列支持 | 原生支持 (字符串、日期等) | 需自行構造表達式返回整數 |
| NULL 值處理 | 允許,NULL 視為單獨值參與哈希 | 表達式結果為 NULL 時行插入失敗 |
| LINEAR 變體 | 支持 LINEAR KEY | 支持 LINEAR HASH |
實戰建議
- 優先考慮 KEY 分區當分區鍵為非整數類型(字符串、日期、二進制)時,無需編寫哈希表達式。
- 分區數選擇 2 的冪次 (4, 8, 16, 32...) 配合 `LINEAR KEY`,擴容縮容數據重分佈最小化。
- 避免過度分區:分區數過多 (>100) 會增加優化器分區裁剪開銷、文件句柄壓力、統計信息收集時間。
- 主鍵/唯一鍵限制:分區鍵必須包含在主鍵/唯一鍵中,否則創建表失敗。