SHOW VARIABLES LIKE 'have_partitioning';
回傳 `YES` 表示支援。MySQL 5.1+ 內建,5.7+ 為標準功能,8.0 持續增強。
./configure --with-plugins=partition ...
make && make install
CREATE TABLE users_part (
uid INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(30) NOT NULL DEFAULT '',
email VARCHAR(30) NOT NULL DEFAULT ''
)
PARTITION BY RANGE (uid) (
PARTITION p0 VALUES LESS THAN (10000)
DATA DIRECTORY = '/data/part0' INDEX DIRECTORY = '/data/part0',
PARTITION p1 VALUES LESS THAN (20000)
DATA DIRECTORY = '/data/part1' INDEX DIRECTORY = '/data/part1',
PARTITION p2 VALUES LESS THAN (30000)
DATA DIRECTORY = '/data/part2' INDEX DIRECTORY = '/data/part2',
PARTITION p3 VALUES LESS THAN MAXVALUE
DATA DIRECTORY = '/data/part3' INDEX DIRECTORY = '/data/part3'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
關鍵點:
# 檔案系統層面會出現符號連結
ls -l /data/mysql/test/
# users_part#P#p0.ibd -> /data/part0/users_part#P#p0.ibd
# ...
# SQL 層面檢視
EXPLAIN PARTITIONS SELECT * FROM users_part WHERE uid = 15000;
-- 輸出 partitions 欄顯示 p1,確認分區剪枝生效
-- 將 p0 (0-9999) 拆分為 s0 (0-3999) 與 s1 (4000-9999)
ALTER TABLE users_part REORGANIZE PARTITION p0 INTO (
PARTITION s0 VALUES LESS THAN (4000)
DATA DIRECTORY = '/data/part0' INDEX DIRECTORY = '/data/part0',
PARTITION s1 VALUES LESS THAN (10000)
DATA DIRECTORY = '/data/part0' INDEX DIRECTORY = '/data/part0'
);
-- 將 s0, s1 合併回 p0
ALTER TABLE users_part REORGANIZE PARTITION s0, s1 INTO (
PARTITION p0 VALUES LESS THAN (10000)
DATA DIRECTORY = '/data/part0' INDEX DIRECTORY = '/data/part0'
);
ALTER TABLE users_part ADD PARTITION (
PARTITION p4 VALUES LESS THAN (40000)
DATA DIRECTORY = '/data/part4' INDEX DIRECTORY = '/data/part4'
);
ALTER TABLE users_part DROP PARTITION p4;
ALTER TABLE users_part TRUNCATE PARTITION p0;
| 類型 | 適用場景 | 語法關鍵字 |
|---|---|---|
| LIST | 離散值列舉 (如地區代碼) | `PARTITION BY LIST(col) (PARTITION p0 VALUES IN (1,2,3), ...)` |
| HASH | 均勻分佈、無明確範圍 | `PARTITION BY HASH(col) PARTITIONS 8` |
| KEY | 類似 HASH 但由 MySQL 計算雜湊 | `PARTITION BY KEY(col) PARTITIONS 8` |
| SUBPARTITION | 複合分區 (RANGE + HASH 等) | `SUBPARTITION BY HASH(col2) PARTITIONS 4` |