在海量數據場景下,MySQL 分區技術是優化資料庫效能、簡化維護運營的關鍵手段。從邏輯視角看,分區表僅是一張普通表;但在物理層面,它由多個獨立的分區對象組成,每個分區可單獨管理、獨立存取。本文系統梳理 MySQL 分區的核心概念、四大分區類型、NULL 值處理機制、分區管理操作及最佳實踐,助力開發者構建高效能、易維護的資料架構。
基於連續、不重疊的區間範圍分發數據,適用於時間序列、ID 範圍等有序場景。MySQL 5.5+ 引入 RANGE COLUMNS 支援非整數類型(如 DATE、DATETIME),並新增 TO_SECONDS() 函數提升日期分區精度。
CREATE TABLE emp (
id INT NOT NULL,
store_id INT DEFAULT NULL
) ENGINE=InnoDB
PARTITION BY RANGE (store_id) (
PARTITION p0 VALUES LESS THAN (10),
PARTITION p1 VALUES LESS THAN (20),
PARTITION p_max VALUES LESS THAN MAXVALUE
);
典型優勢:
ALTER TABLE emp DROP PARTITION p0 避免大事務 DELETE 鎖表風險。針對枚舉值集合分區(如業務類型、地區代碼),無 MAXVALUE 兜底,插入值必須在定義列表中。5.5+ 同樣支援 LIST COLUMNS 實現字串類型分區。
PARTITION BY LIST COLUMNS (category) (
PARTITION p0 VALUES IN ('lodging','food'),
PARTITION p1 VALUES IN ('goods','bads')
);
通過取模(MOD())或線性 2 的冪運算,將數據均勻分佈至預設分區數,核心目標是分散讀寫熱點。常規 HASH 分佈更均勻;LINEAR HASH 維護操作(增/刪/合併/拆分)效能更優,但分佈略有傾斜。
-- 常規 HASH PARTITION BY HASH (id) PARTITIONS 4; -- 線性 HASH PARTITION BY LINEAR HASH (id) PARTITIONS 4;
類似 HASH,但強制使用 MySQL 內部哈希函數,支援除 BLOB/TEXT 外的所有類型。若表存在主鍵/唯一鍵,分區鍵必須包含其列;未指定時默認使用主鍵或非空唯一鍵。
RANGE/LIST COLUMNS 直接使用列名而非表達式,支援多列組合分區。多字段比較遵循元組排序規則:先比第一列,相等時再比第二列,以此類推。
PARTITION BY RANGE COLUMNS (a, b) (
PARTITION p01 VALUES LESS THAN (0, 10),
PARTITION p02 VALUES LESS THAN (10, 10),
PARTITION p03 VALUES LESS THAN (10, 20)
);
| 類型 | 操作 | 語法範例 | 關鍵限制 |
|---|---|---|---|
| RANGE/LIST | 新增 | ADD PARTITION (PARTITION p3 VALUES LESS THAN (2000)) | 新分區範圍必須緊接現有最大值,不可跳躍 |
| 刪除 | DROP PARTITION p1 | 數據隨分區永久刪除,不可恢復 | |
| 拆分 | REORGANIZE PARTITION p3 INTO (PARTITION p2 VALUES LESS THAN (2005), PARTITION p3 VALUES LESS THAN (2015)) | 範圍只能擴大不能縮小,僅能重定義相鄰分區 | |
| 合併 | REORGANIZE PARTITION p3,p4 INTO (PARTITION p2 VALUES LESS THAN (40)) | 合併後範圍 >= 原最大邊界,不可與其他分區重疊 | |
| HASH/KEY | 增加 | ADD PARTITION PARTITIONS 8 | 自動重新哈希分佈,大表操作耗時較長 |
| 合併(減少) | COALESCE PARTITION 2 | 不可用於增加分區數 |
使用 EXPLAIN PARTITIONS SELECT ... 確認查詢是否觸發分區裁剪;SHOW CREATE TABLE 檢視分區定義;INFORMATION_SCHEMA.PARTITIONS 監控各分區數據量與磁碟佔用。
MySQL 分區並非銀彈,但針對大表查詢優化、歷史數據歸檔、跨磁碟 I/O 分散等場景,配合合理的分區鍵與維護策略,能顯著提升系統吞吐與運維效率。