分區是物理資料庫設計技術,主要目的:在特定 SQL 作業中減少資料讀寫總量,縮短回應時間。DBA 與建模人員應熟練掌握。
將資料表的列依條件分散到不同分區。所有欄位在每個分區完整保留,表特性不變。
將資料表欄位垂直切分,減少目標表寬度。不常用的大欄位(TEXT、BLOB)移至獨立分區,保持資料關聯同時提升常用欄位存取速度。
優化器若知曉目標資料僅在特定分區,直接掃描該分區(分區裁剪)。百萬列表分 10 區,掃描時間降為 1/10;索引建立更快;若分區分佈不同磁碟,I/O 理論可提升 100 倍。
DBA 可針對特定分區執行刪除/歸檔/維護,不影響其他分區資料完整性。分區由系統自動管理,無需手工維護。
-- 分區表
CREATE TABLE part_tab (
c1 INT DEFAULT NULL,
c2 VARCHAR(30) DEFAULT NULL,
c3 DATE DEFAULT NULL
) ENGINE=MyISAM
PARTITION BY RANGE (YEAR(c3)) (
PARTITION p0 VALUES LESS THAN (1995),
PARTITION p1 VALUES LESS THAN (1996),
...
PARTITION p11 VALUES LESS THAN MAXVALUE
);
-- 非分區表
CREATE TABLE no_part_tab (c1 INT, c2 VARCHAR(30), c3 DATE) ENGINE=MyISAM;
-- 預存程序向 part_tab 每區均勻寫入 800 萬筆
CALL load_part_tab(); -- 8 分 17 秒
INSERT INTO no_part_tab SELECT * FROM part_tab; -- 51 秒
| 表類型 | 查詢 | 耗時 | EXPLAIN 關鍵資訊 |
|---|---|---|---|
| 非分區 | SELECT COUNT(*) FROM no_part_tab WHERE c3 BETWEEN '1995-01-01' AND '1995-12-31' | 38.30 秒 | type=ALL, rows=8000000, 全表掃描 |
| 分區 | SELECT COUNT(*) FROM part_tab WHERE c3 BETWEEN '1995-01-01' AND '1995-12-31' | 3.88 秒 | partitions=p1, rows=798458, 僅掃描 p1 |
移除低頻 VARCHAR(30) 欄位 c2 後,同樣查詢從 3.88 秒再降至 0.34 秒,再獲 90% 效能提升。設計時務必審視欄位是否真正關聯查詢需求。
INFORMATION_SCHEMA.PARTITIONSADD/DROP/COALESCE/REORGANIZE/ANALYZE/CHECK/OPTIMIZE/REBUILD/REPAIR PARTITION