分區將大表按規則拆分為多個物理片段,提升查詢剪枝、歸檔刪除、並行聚合效能。本文覆蓋 RANGE/LIST/HASH/KEY 四大類型、子分區、管理操作、核心限制。
SHOW VARIABLES LIKE '%partition%';
-- have_partitioning = YES 表示支援
CREATE TABLE p_range (
id INT NOT NULL AUTO_INCREMENT,
name CHAR(20),
PRIMARY KEY (id)
) ENGINE=MyISAM
PARTITION BY RANGE (id) (
PARTITION p0 VALUES LESS THAN (8),
PARTITION p1 VALUES LESS THAN MAXVALUE
);
MAXVALUE 必備,否則超出範圍寫入報錯CREATE TABLE p_list (
id INT NOT NULL AUTO_INCREMENT,
typeid MEDIUMINT,
PRIMARY KEY (id, typeid)
) ENGINE=MyISAM
PARTITION BY LIST (typeid) (
PARTITION p0 VALUES IN (1,2,3,4),
PARTITION p1 VALUES IN (5,6,7,8)
);
MAXVALUE 等價寫法,**所有可能值必須列全**CREATE TABLE p_hash (
id INT NOT NULL AUTO_INCREMENT,
storeid MEDIUMINT,
PRIMARY KEY (id, storeid)
) ENGINE=InnoDB
PARTITION BY HASH (storeid) PARTITIONS 4;
MOD(expr, partitions) 分佈expr 可為欄位或表達式(如 YEAR(created)),但複雜表達式影響寫入效能LINEAR HASH(線性哈希),增刪分區更快,適合 TB 級大表CREATE TABLE p_key (
id INT NOT NULL AUTO_INCREMENT,
keyname CHAR(20),
PRIMARY KEY (id)
) ENGINE=MyISAM
PARTITION BY KEY (id) PARTITIONS 4;
PARTITION BY RANGE (YEAR(createtime))
SUBPARTITION BY HASH (MONTH(createtime)) (
PARTITION p0 VALUES LESS THAN (2012) (
SUBPARTITION s1, SUBPARTITION s2
),
PARTITION p1 VALUES LESS THAN (2013) (
SUBPARTITION s3, SUBPARTITION s4
),
PARTITION p2 VALUES LESS THAN MAXVALUE (
SUBPARTITION s5, SUBPARTITION s6
)
);
| 操作 | RANGE/LIST | HASH/KEY |
|---|---|---|
| 刪除分區 | ALTER TABLE t DROP PARTITION p1;(資料同刪) | ALTER TABLE t COALESCE PARTITION 2;(合併減少) |
| 增加分區 | ALTER TABLE t ADD PARTITION (PARTITION p2 VALUES IN (9,10)); | ALTER TABLE t ADD PARTITION PARTITIONS 6; |
| 重組分區(保留資料) | ALTER TABLE t REORGANIZE PARTITION p0,p1 INTO (...); | 不支援 REORGANIZE |
| 清空分區資料 | ALTER TABLE t TRUNCATE PARTITION p0; | 同左 |
-- 重建(整理碎片)
ALTER TABLE t REBUILD PARTITION (p0, p1);
-- 優化(回收空間)
ALTER TABLE t OPTIMIZE PARTITION (p0, p1);
-- 分析統計
ALTER TABLE t ANALYZE PARTITION (p3);
-- 修復損壞
ALTER TABLE t REPAIR PARTITION (p0, p1);
-- 檢查
ALTER TABLE t CHECK PARTITION (p1);
EXPLAIN PARTITIONS SELECT * FROM p_hash;
SELECT * FROM information_schema.PARTITIONS WHERE TABLE_NAME = 'p_list';
SHOW CREATE TABLE p_list;