當單表資料量超過千萬列,查詢效能與維護成本將成為瓶頸。MySQL 表分區將邏輯大表物理拆分為多個獨立分區,實現資料分層管理、查詢裁剪與並行操作。本文系統整理分區類型、建立語法、修改維護與監控指令。
CREATE TABLE sales (
id INT NOT NULL AUTO_INCREMENT,
sale_date DATE NOT NULL,
amount DECIMAL(10,2),
PRIMARY KEY (id, sale_date)
) PARTITION BY RANGE (YEAR(sale_date)) (
PARTITION p2020 VALUES LESS THAN (2021),
PARTITION p2021 VALUES LESS THAN (2022),
PARTITION p2022 VALUES LESS THAN (2023),
PARTITION pmax VALUES LESS THAN MAXVALUE
);
CREATE TABLE employees (
id INT NOT NULL,
dept_id INT NOT NULL,
name VARCHAR(50),
PRIMARY KEY (id, dept_id)
) PARTITION BY LIST (dept_id) (
PARTITION p_hr VALUES IN (10),
PARTITION p_rd VALUES IN (20, 30),
PARTITION p_sale VALUES IN (40),
PARTITION p_other VALUES IN (50, 60, 99)
);
CREATE TABLE logs (
id BIGINT NOT NULL AUTO_INCREMENT,
created_at DATETIME NOT NULL,
msg TEXT,
PRIMARY KEY (id, created_at)
) PARTITION BY HASH (YEAR(created_at)) PARTITIONS 8;
CREATE TABLE users (
uid VARCHAR(36) NOT NULL,
email VARCHAR(100),
PRIMARY KEY (uid)
) PARTITION BY KEY (uid) PARTITIONS 4;
-- RANGE + HASH:按年份分區,每年再按月雜湊
CREATE TABLE orders (
id BIGINT NOT NULL,
order_date DATE NOT NULL,
amount DECIMAL(10,2),
PRIMARY KEY (id, order_date)
) PARTITION BY RANGE (YEAR(order_date))
SUBPARTITION BY HASH (MONTH(order_date)) SUBPARTITIONS 12 (
PARTITION p2022 VALUES LESS THAN (2023),
PARTITION p2023 VALUES LESS THAN (2024),
PARTITION pmax VALUES LESS THAN MAXVALUE
);
-- 非分區表轉為 RANGE 分區
ALTER TABLE trade_records
PARTITION BY RANGE (UNIX_TIMESTAMP(trade_time)) (
PARTITION p202301 VALUES LESS THAN (UNIX_TIMESTAMP('2023-02-01')),
PARTITION pmax VALUES LESS THAN MAXVALUE
);
-- 新增分區
ALTER TABLE trade_records ADD PARTITION (
PARTITION p202302 VALUES LESS THAN (UNIX_TIMESTAMP('2023-03-01'))
);
-- 刪除分區(資料同步刪除)
ALTER TABLE trade_records DROP PARTITION p202201, p202202;
-- 合併分區
ALTER TABLE trade_records REORGANIZE PARTITION p202201, p202202 INTO (
PARTITION p2022q1 VALUES LESS THAN (UNIX_TIMESTAMP('2022-04-01'))
);
-- 拆分分區
ALTER TABLE trade_records REORGANIZE PARTITION pmax INTO (
PARTITION p202303 VALUES LESS THAN (UNIX_TIMESTAMP('2023-04-01')),
PARTITION pmax VALUES LESS THAN MAXVALUE
);
| 操作 | 指令範例 | 用途 |
|---|---|---|
| 查看分區狀態 | SELECT * FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_NAME='trade_records'; | 檢視每分區列數、大小、運算式 |
| 重建分區(整理碎片) | ALTER TABLE trade_records REBUILD PARTITION p202201, p202202; | 等同 DELETE+INSERT,釋放空間 |
| 優化分區 | ALTER TABLE trade_records OPTIMIZE PARTITION p202201; | 回收可變長度欄位碎片 |
| 分析分區 | ALTER TABLE trade_records ANALYZE PARTITION p202201; | 更新索引統計資訊 |
| 修復損壞分區 | ALTER TABLE trade_records REPAIR PARTITION p202201; | 修正資料/索引損毀 |
| 檢查分區 | ALTER TABLE trade_records CHECK PARTITION p202201; | 偵測損壞 |