MySQL 5.1+ 支援表分區,邏輯上為單表,物理上將數據文件按規則拆分,對應用透明。分區非真正拆表,而是存儲層切分。
SHOW PLUGINS; -- partition ACTIVE SHOW VARIABLES LIKE '%part%'; -- have_partitioning=YES
NOT NULL,否則無法確定分區歸屬CREATE TABLE employees ( id INT NOT NULL, store_id INT NOT NULL, PRIMARY KEY (id, store_id) ) ENGINE=MyISAM 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 (21) ); -- 按年份分區 (支援函數) PARTITION BY RANGE (YEAR(separated)) ( PARTITION p0 VALUES LESS THAN (2001), PARTITION p1 VALUES LESS THAN (2011), PARTITION p2 VALUES LESS THAN (2021), PARTITION p3 VALUES LESS THAN MAXVALUE );
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) );
PARTITION BY HASH (YEAR(hired)) PARTITIONS 4;
PARTITION BY KEY (col1, col2) PARTITIONS 4;
MyISAM 獨立表空間直接可見:
employees.frm -- 表結構 employees.par -- 分區定義 employees#P#pNorth.MYD/.MYI -- 各分區數據/索引
InnoDB 需開啟 innodb_file_per_table=1 才會產生獨立 .ibd 文件。
| 操作 | 語法 |
|---|---|
| 刪除分區 (數據同步刪除) | ALTER TABLE employees DROP PARTITION pWest; |
| RANGE 新增 | ALTER TABLE employees ADD PARTITION (PARTITION p4 VALUES LESS THAN (26)); |
| LIST 新增 | ALTER TABLE employees ADD PARTITION (PARTITION pSouth VALUES IN (21,22,23)); |
| HASH/KEY 重分區 | ALTER TABLE employees ADD PARTITION PARTITIONS 5; |
分區裁剪 (Partition Pruning) 只有當 WHERE 條件包含分區鍵時才生效,EXPLAIN 中 partitions 列顯示實際掃描分區。