MySQL 5.1+ 引入表分區,將邏輯上的一張大表按規則拆分為多個物理分區,提升可管理性、可擴展性與查詢效能。
DROP PARTITION 秒級完成,避免大事務 DELETE。WHERE 條件命中分區鍵時,僅掃描相關分區。SUM/COUNT 可在各分區並行執行再彙總。| 類型 | 核心邏輯 | 典型場景 |
|---|---|---|
| RANGE | 連續區間,VALUES LESS THAN | 時間序列、自增 ID、店鋪編號區間 |
| LIST | 離散值集合,VALUES IN | 地區、業務線、狀態碼等枚舉值 |
| HASH | 用戶定義表達式取模 | 均勻分佈熱點數據、無明顯範圍特徵 |
| KEY | MySQL 內部哈希函數,支援多列 | 非整數列、複合鍵、不想自寫表達式 |
CREATE TABLE employees (
id INT NOT NULL,
fname VARCHAR(30),
lname VARCHAR(30),
hired DATE NOT NULL DEFAULT '1970-01-01',
separated DATE NOT NULL DEFAULT '9999-12-31',
job_code INT NOT NULL,
store_id INT NOT NULL
)
PARTITION BY RANGE (store_id) (
PARTITION p0 VALUES LESS THAN (6),
PARTITION p1 VALUES LESS THAN (11),
PARTITION p2 VALUES LESS THAN (16),
PARTITION p3 VALUES LESS THAN MAXVALUE
);
MAXVALUE 兜底,避免插入超出範圍報錯。後續可 ALTER TABLE ... ADD PARTITION 擴展。
CREATE TABLE employees (...)
PARTITION BY LIST (store_id) (
PARTITION pNorth VALUES IN (3,5,6,9,17),
PARTITION pEast VALUES IN (1,2,10,11,19,20),
PARTITION pWest VALUES IN (4,12,13,14,18),
PARTITION pCentral VALUES IN (7,8,15,16)
);
插入值不在列表會報錯,無 MAXVALUE 兜底。
CREATE TABLE employees (...)
PARTITION BY HASH(store_id)
PARTITIONS 4;
線性哈希 LINEAR HASH 採用 2 的冪算法,增刪分區更快,但分佈可能不如普通 HASH 均勻。
CREATE TABLE tk (
col1 INT NOT NULL,
col2 CHAR(5),
col3 DATE
)
PARTITION BY LINEAR KEY (col1)
PARTITIONS 3;
-- 查看分區
EXPLAIN PARTITIONS SELECT * FROM employees WHERE store_id = 8;
-- 新增分區(RANGE)
ALTER TABLE employees ADD PARTITION (PARTITION p4 VALUES LESS THAN (21));
-- 刪除分區(數據隨之刪除,不可恢復)
ALTER TABLE employees DROP PARTITION p0;
-- 重組分區(合併/拆分)
ALTER TABLE employees REORGANIZE PARTITION p1,p2 INTO (PARTITION p12 VALUES LESS THAN (16));
-- 將分區升級為表(MySQL 8.0+)
ALTER TABLE employees EXCHANGE PARTITION p3 WITH TABLE employees_archive;
SELECT ... PARTITION (p0,p1) 可顯式指定掃描分區。分區不是銀彈,適合「大表、明顯訪問模式、歷史數據歸檔」場景。小表或訪問模式雜亂反而增加優化器負擔。