DROP PARTITION 秒級歸檔舊數據,避免大事務 DELETE。| 類型 | 適用場景 | 分區運算式範例 |
|---|---|---|
| RANGE | 時間序列、連續數值區間 | PARTITION BY RANGE (YEAR(dt)*100+MONTH(dt)) |
| LIST | 離散枚舉值(地區、狀態) | PARTITION BY LIST (region_id) |
| HASH | 均勻分散、無明顯範圍 | PARTITION BY HASH (user_id) |
| KEY | 類似 HASH 但由 MySQL 內部哈希 | PARTITION BY KEY (col) |
CREATE TABLE sale_data (
sale_date DATETIME NOT NULL,
sale_item VARCHAR(2) NOT NULL,
sale_money DECIMAL(10,2) NOT NULL
) ENGINE=InnoDB
PARTITION BY RANGE (YEAR(sale_date)*100 + MONTH(sale_date)) (
PARTITION p202401 VALUES LESS THAN (202402),
PARTITION p202402 VALUES LESS THAN (202403),
PARTITION p202403 VALUES LESS THAN (202404),
PARTITION pmax VALUES LESS THAN MAXVALUE
);
-- 新增分區
ALTER TABLE sale_data ADD PARTITION (PARTITION p202404 VALUES LESS THAN (202405));
-- 刪除分區(連同資料一起刪,極快)
ALTER TABLE sale_data DROP PARTITION p202401;
-- 合併分區
ALTER TABLE sale_data REORGANIZE PARTITION p202401,p202402,p202403 INTO (
PARTITION p2024Q1 VALUES LESS THAN (202404)
);
-- 拆分分區
ALTER TABLE sale_data REORGANIZE PARTITION p2024Q1 INTO (
PARTITION p202401 VALUES LESS THAN (202402),
PARTITION p202402 VALUES LESS THAN (202403),
PARTITION p202403 VALUES LESS THAN (202404)
);
-- 截斷分區資料(保留定義)
ALTER TABLE sale_data TRUNCATE PARTITION p202401;
CREATE TABLE ts (
id INT, purchased DATE
) ENGINE=InnoDB
PARTITION BY RANGE (YEAR(purchased))
SUBPARTITION BY HASH (id)
(
PARTITION p0 VALUES LESS THAN (1990) (
SUBPARTITION s0 DATA DIRECTORY='/disk1' INDEX DIRECTORY='/idx1',
SUBPARTITION s1 DATA DIRECTORY='/disk2' INDEX DIRECTORY='/idx2'
),
PARTITION p1 VALUES LESS THAN (MAXVALUE) (
SUBPARTITION s2 DATA DIRECTORY='/disk3',
SUBPARTITION s3 DATA DIRECTORY='/disk4'
)
);
EXPLAIN PARTITIONS SELECT * FROM sale_data WHERE sale_date < '2024-03-01';
-- partitions 欄位顯示 p202401,p202402 → 裁剪生效
YEAR()、TO_DAYS()、UNIX_TIMESTAMP() 等)。LOAD INDEX INTO CACHE 不支援。EXPLAIN PARTITIONS 實測。分區表是大數據量單表優化的利器,善用「分區裁剪」與「秒級歸檔」兩大核心價值。