單表超過 1000 萬行性能急劇下降,分區表將邏輯大表物理拆分為多個分區,支援分區裁剪、並行聚合、歷史數據秒級歸檔。本文系統講解五大分區類型語法、分區鍵選擇原則、新增/刪除/合併分區管理操作、主鍵與 NULL 限制、適用場景與避坑指南。
DROP PARTITION 秒級歸檔歷史數據,無 DELETE 開銷。SUM/COUNT)可並行執行於各分區。CREATE TABLE t_range (
id INT, money INT UNSIGNED NOT NULL, dt DATETIME
) PARTITION BY RANGE (YEAR(dt)) (
PARTITION p2007 VALUES LESS THAN (2008),
PARTITION p2008 VALUES LESS THAN (2009),
PARTITION p2009 VALUES LESS THAN (2010),
PARTITION p2010 VALUES LESS THAN MAXVALUE
);
CREATE TABLE t_list (
a INT, b INT
) PARTITION BY LIST (b) (
PARTITION p0 VALUES IN (1,3,5,7,9),
PARTITION p1 VALUES IN (2,4,6,8,0)
);
CREATE TABLE t_hash (
a INT, b DATETIME
) PARTITION BY HASH (YEAR(b)) PARTITIONS 4;
CREATE TABLE t_key (
a INT, b DATETIME
) PARTITION BY KEY (b) PARTITIONS 4;
-- RANGE COLUMNS
CREATE TABLE t_rc (dt DATE, name VARCHAR(20))
PARTITION BY RANGE COLUMNS (dt) (
PARTITION p0 VALUES LESS THAN ('2020-01-01'),
PARTITION p1 VALUES LESS THAN ('2021-01-01')
);
-- LIST COLUMNS
CREATE TABLE t_lc (city VARCHAR(20))
PARTITION BY LIST COLUMNS (city) (
PARTITION p_bj VALUES IN ('北京'),
PARTITION p_sh VALUES IN ('上海')
);
支援類型:整數、DATE/DATETIME、CHAR/VARCHAR/BINARY/VARBINARY;不支援 FLOAT/DECIMAL/BLOB/TEXT。
ALTER TABLE sale_data ADD PARTITION (PARTITION p201010 VALUES LESS THAN (201011));
ALTER TABLE sale_data DROP PARTITION p201010;
ALTER TABLE sale_data
REORGANIZE PARTITION p201001,p201002,p201003,p201004,p201005,p201006,p201007,p201008,p201009
INTO (
PARTITION p2010Q1 VALUES LESS THAN (201004),
PARTITION p2010Q2 VALUES LESS THAN (201007),
PARTITION p2010Q3 VALUES LESS THAN (201010)
);
| 限制 | 說明 | 應對 |
|---|---|---|
| 主鍵包含分區鍵 | 若定義 PK,分區列必須是 PK 的一部分 | 不定義 PK,或 PK=(id, partition_col) |
| 分區列不能為 NULL | NULL 無法確定分區 | 定義 NOT NULL,或用 DEFAULT 值 |
| 外鍵不支援 | 分區表不能有 FK | 應用層維護引用完整性 |
| 最大 8192 個分區 | 5.6+ 8192,早期 1024 | 按月分區可支撐 600+ 年 |
| 全文索引不支援 | 5.6+ 移除限制,但需注意 | 驗證版本特性 |
RANGE COLUMNS (dt) 按月/日分區,配合 DROP PARTITION 歸檔。LIST COLUMNS。KEY 或 HASH。