邏輯水平分表,僅訪問目標分區,降低掃描量。適用海量數據、歷史歸檔、並行聚合、跨盤 I/O 分散。
| 類型 | 分區鍵 | 典型場景 |
|---|---|---|
| RANGE | 連續範圍(日期、ID 段) | 按年/月分區,歷史數據快速刪除 |
| LIST | 離散值列表(地區、狀態碼) | 按省份/業務類型分區 |
| HASH | 整數表達式 Hash | 均勻分佈,無明確範圍 |
| KEY | MySQL 內部 Hash(支援非整數) | 字串列分區,如用戶名 |
CREATE TABLE salaries ( emp_no INT NOT NULL, salary INT NOT NULL, from_date DATE NOT NULL, to_date DATE NOT NULL, PRIMARY KEY (emp_no, from_date) ) PARTITION BY RANGE (YEAR(from_date)) ( PARTITION p0 VALUES LESS THAN (1990), PARTITION p1 VALUES LESS THAN (1995), PARTITION p2 VALUES LESS THAN (2000), PARTITION p3 VALUES LESS THAN (2005), PARTITION p4 VALUES LESS THAN MAXVALUE );
SELECT COUNT(*) FROM salaries WHERE from_date BETWEEN '1999-01-01' AND '1999-12-31';
SELECT COUNT(*) FROM salaries WHERE YEAR(from_date)=1999; -- 無法命中分區
EXPLAIN PARTITIONS 顯示掃描所有分區。改寫為範圍條件即可命中。
同條件下分區表連接查詢約快 3 倍,數據量越大優勢越明顯。
ALTER TABLE salaries DROP PARTITION p0; -- 0.05s vs DELETE 2.82s
刪除分區即丟棄文件,極速。後續插入 1998 年數據自動路由回 p0(或新建分區)。
YEAR()、TO_DAYS())