MySQL 5.1+ 引入的分區功能,將邏輯上單一大表物理拆分為多個較小的分區,每個分區可獨立儲存、維護與查詢。正確使用分區能大幅提升大資料量場景下的查詢效能、維護彈性與儲存成本控制。
DROP PARTITION 刪除舊分區,秒級完成、無碎片、不影響線上服務| 類型 | 適用場景 | 範例 | 優點 | 缺點 |
|---|---|---|---|---|
| RANGE | 時間序列、連續數值區間 | 按年/月分區訂單表 | 範圍查詢極快、易管理歷史資料 | 熱點寫入集中於最新分區 |
| LIST | 離散值列舉(地區、狀態、租戶) | 按城市分區用戶表 | 精確控制分區歸屬 | 值變更需 REORGANIZE PARTITION |
| HASH | 均衡分散、無明顯業務維度 | 用戶 ID 取模分區 | 寫入負載均衡、無熱點 | 範圍查詢需全分區掃描 |
| KEY | 非整數欄位、MySQL 自動計算雜湊 | UUID、字串欄位分區 | 支援非整數型別 | 效能略低於 HASH |
YEAR(date)、TO_DAYS())。字串型別需用 KEY 分區或建立整數虛擬欄位PRIMARY KEY (id, created_at) 配合 PARTITION BY RANGE (YEAR(created_at))RANGE COLUMNS(created_at)(5.5+)或 RANGE (TO_DAYS(created_at)),避免函數導致分區裁剪失效CRC32(email))配合 HASH 分區-- 按月 RANGE 分區(訂單表)
CREATE TABLE orders (
id BIGINT NOT NULL,
created_at DATETIME NOT NULL,
amount DECIMAL(10,2),
PRIMARY KEY (id, created_at)
) PARTITION BY RANGE COLUMNS (created_at) (
PARTITION p202301 VALUES LESS THAN ('2023-02-01'),
PARTITION p202302 VALUES LESS THAN ('2023-03-01'),
PARTITION pmax VALUES LESS THAN MAXVALUE
);
-- 按用戶 ID HASH 分區(均衡寫入)
CREATE TABLE user_logs (
user_id INT NOT NULL,
log_time DATETIME NOT NULL,
content TEXT,
PRIMARY KEY (user_id, log_time)
) PARTITION BY HASH (user_id) PARTITIONS 16;
ALTER TABLE t DROP PARTITION p202201; — 秒級刪除歷史分區ALTER TABLE t ADD PARTITION (PARTITION p202312 VALUES LESS THAN ('2024-01-01')); — 新增未來分區ALTER TABLE t REORGANIZE PARTITION pmax INTO (...); — 拆分 MAXVALUE 分區EXPLAIN PARTITIONS SELECT ...; — 驗證分區裁剪是否生效MySQL 分區是大資料量單表優化的利器,但非銀彈。決策前務必評估:查詢模式是否符合分區裁剪、維護複雜度是否可控、是否觸發上述限制。結合讀寫分離、分庫分表、冷熱分離等架構手段,才能構建真正可擴展的資料層。