MERGE (別名 MRG_MyISAM) 是一種邏輯視圖引擎,將多個結構完全相同的 MyISAM 表聚合為一個虛擬表,查詢時自動路由至各子表並合併結果。適用於日誌分表、歷史歸檔、只讀報表等場景。本文詳細講解建表語法、參數含義、操作限制、效能特徵與遷移建議。
.frm (結構) 和 .MRG (子表列表) 文件。0 禁用、FIRST 首表、LAST 末表 (4.0+)。-- 底表 (MyISAM)
CREATE TABLE test_merge_1 (
id INT(5) NOT NULL,
value VARCHAR(100) NOT NULL,
PRIMARY KEY (id)
) ENGINE=MyISAM;
CREATE TABLE test_merge_2 (
id INT(5) NOT NULL,
value VARCHAR(100) NOT NULL,
PRIMARY KEY (id)
) ENGINE=MyISAM;
-- MERGE 表
CREATE TABLE test_merge (
id INT(5) NOT NULL,
value VARCHAR(100) NOT NULL,
PRIMARY KEY (id)
) ENGINE=MRG_MyISAM
UNION=(test_merge_1, test_merge_2)
INSERT_METHOD=LAST; -- 新數據寫入 test_merge_2
| 特性 | 說明 |
|---|---|
| 存儲引擎要求 | 底表必須為 MyISAM,不支援 InnoDB/Memory/NDB |
| 結構一致性 | 列定義、索引、主鍵須 100% 一致,否則報錯 |
| 同庫限制 | 所有底表必須屬於同一數據庫 |
| 索引 | MERGE 表可定義索引,但實際由底表索引服務;主鍵唯一性不跨表強制 |
| 約束 | 外鍵、CHECK、觸發器在 MERGE 表無效,由底表控制 |
| INSERT_METHOD | 0=禁用插入,FIRST=寫第一張底表,LAST=寫最後一張底表 |
| REPLACE/UPDATE/DELETE | 按主鍵在第一個匹配的底表執行 (按 UNION 順序) |
| SELECT | 全表掃描所有底表並合併結果,ORDER BY 需文件排序 |
| DROP MERGE 表 | 僅刪除 .frm/.MRG,底表數據完好 |
| 動態修改子表 | 編輯 .MRG 文件 (每行一底表名) + FLUSH TABLES 生效 |
log_202301, log_202302... MERGE 表 log_all 聚合查詢。SELECT * FROM merge WHERE id=1 僅返回第一張匹配行 (按 UNION 順序)。PARTITION BY RANGE/LIST/HASH/KEY 支援分區裁剪、並行查詢、InnoDB、全局索引,全方位優於 MERGE。| 維度 | MERGE | 原生分區 (Partitioning) |
|---|---|---|
| 引擎支援 | 僅 MyISAM | InnoDB、MyISAM、NDB 等 |
| 分區裁剪 | 無 (全表掃描) | 優化器自動裁剪 |
| 並行查詢 | 不支援 | 5.6+ partition_pruning 並行 |
| 全局唯一索引 | 無 (跨表不唯一) | 支援 (主鍵含分區鍵) |
| 動態增減分區 | 編輯 .MRG + FLUSH | ALTER TABLE ... ADD/DROP/REORGANIZE PARTITION |
| 外鍵/觸發器 | 不支援 | InnoDB 分區支援 |
| 維護複雜度 | 手工管理底表 | DDL 自動化、工具生態完善 |
CREATE TABLE new_partitioned ... PARTITION BY RANGE (...) SELECT * FROM merge_table; 驗證數據一致 → 切換應用 → 刪除 MERGE 表與底表。MERGE 引擎是 MySQL 早期為解決 MyISAM 表大小限制、實現邏輯分表而設計的權宜之計。隨著原生分區、InnoDB 成熟、OLAP 引擎普及,MERGE 已完成歷史使命。新項目嚴禁使用 MERGE,存量系統應納入技術債清理計畫,遷移至原生分區或專用 OLAP 系統。