KEY 分區 是 MySQL 提供的內建哈希分區機制,與 HASH 分區類似,但哈希函式由 MySQL 服務層提供,無需用戶定義表達式。本文深入解析 KEY 分區底層算法、語法規則、線性分區變體及適用場景,助你正確選型分區策略。
| 特性 | HASH 分區 | KEY 分區 |
|---|---|---|
| 哈希函式 | 用戶自定義表達式(如 HASH(id)、HASH(YEAR(date))) | MySQL 內建函式 |
| MySQL Cluster | 不適用 | 使用 MD5() |
| 其他引擎 | 用戶定義 | 基於 PASSWORD() 同源算法 |
| 分區鍵類型 | 整數表達式 | 支援非整數列(字串、日期等) |
| 語法關鍵字 | HASH | KEY |
關鍵優勢: KEY 分區可直接使用字串、日期等非整數列作為分區鍵,MySQL 內部自動計算哈希值,無需手工構造表達式。
CREATE TABLE tk (
col1 INT NOT NULL,
col2 CHAR(5),
col3 DATE
)
PARTITION BY KEY (col1)
PARTITIONS 3;
PARTITION BY KEY (col_list):指定一個或多個列名列表(非表達式)。PARTITIONS N:指定分區數量,MySQL 自動按哈希值分配。引入 LINEAR 關鍵字,改用 2 的冪次算法 而非取模算法計算分區編號:
CREATE TABLE tk (
col1 INT NOT NULL,
col2 CHAR(5),
col3 DATE
)
PARTITION BY LINEAR KEY (col1)
PARTITIONS 3;
partition_id = hash(col1) MOD N效果: 當 PARTITIONS 非 2 的冪次時,LINEAR KEY 的分區分佈更均勻,重組開銷更低。
VARCHAR 用戶名、DATE 時間戳、CHAR 代碼)。PARTITION BY RANGE(...) SUBPARTITION BY KEY(...)。LINEAR KEY。NOT NULL,避免 NULL 值哈希衝突導致分區分佈傾斜。PARTITIONS 數量建議設為 2 的冪次(2, 4, 8, 16...),配合 LINEAR KEY 效果最佳。KEY 分區以「零配置、內建哈希、支援非整數列」為核心特性,填補了 HASH 分區需自定義表達式的缺口,是字串、日期類分區鍵的首選方案。LINEAR KEY 變體進一步優化了分區重組性能。實際選型時,應根據分區鍵數據類型、業務語義與運維需求,在 RANGE、LIST、HASH、KEY 四大分區類型中做最佳匹配。