將一張邏輯大表,根據分區鍵物理拆分為多個獨立的分區(底層為多個 .ibd 文件)。SQL 層面透明,優化器自動進行分區裁剪,僅掃描相關分區。MySQL 5.1+ 支援,8.0 大幅增強。
DROP PARTITION 秒級完成,避免 DELETE 產生碎片、鎖表、產生大量 Binlog。SUM/COUNT 可在各分區並行執行,彙總結果。基於列值屬於給定連續區間分配行。區間不可重疊,用 VALUES LESS THAN 定義。
CREATE TABLE employees ( id INT NOT NULL, fname VARCHAR(30), hired DATE NOT NULL DEFAULT '1970-01-01', 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 -- 兜底分區,防插入報錯 );
DROP PARTITION p0 秒級歸檔;範圍查詢自動裁剪。NOT NULL,表達式不可返回 NULL。基於列值匹配離散值列表。用 VALUES IN (...) 定義。
CREATE TABLE employees ( id INT NOT NULL, store_id INT NOT NULL ) 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 ( id INT NOT NULL, store_id INT NOT NULL ) PARTITION BY HASH (store_id) PARTITIONS 4;
PARTITION BY LINEAR HASH(expr),用 2 的冪次映射,增刪分區極快(適合超大表),但數據分佈可能不如標準哈希均勻。類似 HASH,但哈希函數由 MySQL 內部提供,支援一列或多列,列類型不限於整數(字符串也可)。
CREATE TABLE tk ( col1 INT NOT NULL, col2 CHAR(5), col3 DATE ) PARTITION BY LINEAR KEY (col1) PARTITIONS 3;
RANGE + HASH/KEY、LIST + HASH/KEY 兩級分區。例如:一級按年 RANGE,二級按用戶 ID HASH,同時享受時間歸檔與熱點均勻。
| 操作 | 語法示例 | 說明 |
|---|---|---|
| 新增分區 | ALTER TABLE t ADD PARTITION (PARTITION p4 VALUES LESS THAN (21)) | RANGE/LIST 尾部新增 |
| 刪除分區 | ALTER TABLE t DROP PARTITION p0 | 數據永久丟失,謹慎操作 |
| 截斷分區 | ALTER TABLE t TRUNCATE PARTITION p1 | 清空數據保留結構,5.6+ |
| 重組分區 | ALTER TABLE t REORGANIZE PARTITION p2 INTO (PARTITION p2 VALUES LESS THAN (16), PARTITION p3 VALUES LESS THAN (21)) | 拆分/合併分區 |
| 交換分區 | ALTER TABLE t EXCHANGE PARTITION p1 WITH TABLE t_staging | 秒級載入/卸載數據,5.6+ |
PRIMARY KEY (id, store_id) 或 UNIQUE KEY (store_id, ...)。EXPLAIN PARTITIONS SELECT ... 觀察 partitions 列是否為目標分區而非 ALL。INSERT SELECT 分批遷移 → 重命名切換,或用 pt-online-schema-change。