面對單表億級資料、查詢緩慢、維護困難等痛點,MySQL 分區表是「不拆分業務、不遷移架構」的低成本破局關鍵。本文系統梳理分區表核心概念、六大分區類型語法、限制條件、支援檢測與實戰選型建議。
分區表:依據規則將一張邏輯大表拆分為多個物理分區。邏輯上是一張表,物理上是多個分區檔案。每個分區可獨立存放於不同磁碟/檔案系統,實現 I/O 分散與並行處理。
| 維度 | 分區表 | 分表 |
|---|---|---|
| 邏輯視圖 | 單一表名 | 多張表(如 order_2023, order_2024) |
| 應用改造 | 零改造,SQL 透明 | 需修改路由邏輯 |
| 跨分區查詢 | 原生支援 | 需 UNION 或中間層聚合 |
| 維護操作 | DROP/TRUNCATE PARTITION 秒級 | DROP TABLE 同等 |
| 索引/外鍵 | 全域唯一,限制較多 | 各表獨立,較靈活 |
WHERE 條件含分區鍵時,僅掃描相關分區(Partition Pruning),大幅降低掃描量。DROP PARTITION,避免大量 DELETE 產生碎片與鎖爭用。COLUMNS 分區,直接支援整數、日期時間、字串型別(不含 BLOB/TEXT)。SHOW VARIABLES LIKE '%partition%';
-- 回傳 have_partitioning = YES 即支援
PARTITION BY RANGE (expr) (
PARTITION p0 VALUES LESS THAN (10),
PARTITION p1 VALUES LESS THAN (20),
PARTITION p2 VALUES LESS THAN MAXVALUE
)
expr 為欄位或運算式(如 YEAR(created_at))。VALUES LESS THAN value must be strictly increasing。MAXVALUE 兜底分區,捕獲超出範圍資料。PARTITION BY LIST (expr) (
PARTITION p0 VALUES IN (1, 3, 5),
PARTITION p1 VALUES IN (2, 4, 6)
)
MAXVALUE 兜底,插入未列舉值會直接報錯。YEAR() 等函數轉換。PARTITION BY RANGE COLUMNS (a, b, c)。-- 一般 HASH(取模)
PARTITION BY HASH (store_id) PARTITIONS 4;
-- 線性 HASH(Linear Hash,2 的冪次運算,維護效能更好)
PARTITION BY LINEAR HASH (store_id) PARTITIONS 4;
| 類型 | 優點 | 缺點 |
|---|---|---|
| 一般 HASH | 資料分布最均勻 | 增減分區需重組大量資料 |
| 線性 HASH | 增減分區/合併/拆分極快 | 分布較不均勻 |
PARTITION BY KEY (col1, col2) PARTITIONS 4;
-- 不指定欄位時:有 PK 用 PK,無 PK 用第一個 NOT NULL UNIQUE KEY
在一級分區(如 RANGE)下再建立二級分區(如 HASH/KEY):
PARTITION BY RANGE (YEAR(created_at))
SUBPARTITION BY HASH (user_id) SUBPARTITIONS 4 (
PARTITION p2023 VALUES LESS THAN (2024),
PARTITION p2024 VALUES LESS THAN (2025)
)
| 操作 | 指令範例 |
|---|---|
| 新增分區 | ALTER TABLE t ADD PARTITION (PARTITION p3 VALUES LESS THAN (30)); |
| 刪除分區(含資料) | ALTER TABLE t DROP PARTITION p0; |
| 截斷分區(保留結構) | ALTER TABLE t TRUNCATE PARTITION p1; |
| 重組分區(合併/拆分) | ALTER TABLE t REORGANIZE PARTITION p1 INTO (PARTITION p1a VALUES LESS THAN (15), PARTITION p1b VALUES LESS THAN (20)); |
| 移除分區屬性(變回普通表) | ALTER TABLE t REMOVE PARTITIONING; |
| 查看分區資訊 | SELECT * FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_NAME='t'; |
ANALYZE TABLE,確保優化器準確剪枝。mysqldump 預設備份全表,大表建議分區級備份或使用 xtrabackup 物理備份。分區表是 MySQL 單機擴展的利器,用對場景(時間序列、熱點分散、歷史歸檔)能以極低成本解決億級單表效能難題。關鍵在於:分區鍵 = 核心查詢條件,且嚴守限制條件,配合自動化分區管理腳本(如定時新增/歸檔分區),才能長期穩定收益。