MySQL 分區功能可將大型資料表在物理層面拆分為多個較小片段,提升查詢效能與管理彈性。本文說明如何檢查支援狀態,並深入解析分區核心概念與兩大分區策略。
SHOW VARIABLES LIKE '%partition%';
若輸出:
have_partitioning YES
表示支援分區。
SHOW PLUGINS;
若列表中有 partition ACTIVE STORAGE ENGINE GPL,表示分區引擎已啟用。
MySQL 資料以檔案形式儲存於磁碟(預設 /var/lib/mysql,可由 datadir 設定)。一張表對應三個檔案:
.frm:表結構定義.MYD (MyISAM) / .ibd (InnoDB):資料檔案.MYI (MyISAM):索引檔案當單表資料量過大,檔案過大導致查詢緩慢、甚至超過檔案系統限制時,分區可將這三個檔案在物理層面拆分為多個較小片段,查詢時僅掃描相關分區(分區修剪),大幅提升效能;也可將不同分區分散至不同磁碟/掛載點,突破單一磁碟容量限制。
定義:依據某欄位範圍、列表、雜湊等規則,將資料行分配到不同分區。表結構完全相同,每個分區擁有完整欄位。
例子:100 萬筆訂單,依 order_date 每月一個分區,或依 customer_id 雜湊分 10 區。
CREATE TABLE orders (
id INT, order_date DATE, customer_id INT, amount DECIMAL(10,2)
) PARTITION BY RANGE (YEAR(order_date)) (
PARTITION p2023 VALUES LESS THAN (2024),
PARTITION p2024 VALUES LESS THAN (2025),
PARTITION pmax VALUES LESS THAN MAXVALUE
);
優點:查詢可透過分區修剪大幅減少掃描行數;支援分區獨立維護(歸檔、刪除、重建索引)。
定義:將大欄位(如長文本、BLOB)或低頻存取欄位移至獨立表,主表保留高頻核心欄位。實質上是拆表而非原生分區功能。
例子:用戶表拆分為 users_core(id, name, email, status)與 users_profile(user_id, bio, avatar, preferences)。
-- 核心表(高頻存取) CREATE TABLE users_core (id INT PRIMARY KEY, name VARCHAR(50), email VARCHAR(100), status TINYINT); -- 延伸表(低頻、大欄位) CREATE TABLE users_profile (user_id INT PRIMARY KEY, bio TEXT, avatar BLOB, preferences JSON);
優點:核心表行長度大幅縮減,單頁存放更多行,緩存命中率提升;大物件不影響核心查詢效能。
| 類型 | 適用場景 | 範例 |
|---|---|---|
| RANGE | 連續範圍(日期、ID區間) | 按年/月分區歷史資料 |
| LIST | 離散值列表(地區、狀態碼) | 依國家代碼分區 |
| HASH | 均勻分布,無明確範圍 | 大表雜湊分 16 區 |
| KEY | 類似 HASH,支援非整數欄位 | 依 UUID/字串欄位分區 |
| SUBPARTITION | 複合分區(RANGE+HASH 等) | 按年分區再雜湊分區 |
DROP PARTITION 秒級完成)