MERGE 引擎將多張結構完全相同的 MyISAM 表聚合為一個邏輯視圖,適用於日誌、歷史數據等「寫入分散、查詢聚合」場景。本文系統梳理創建規約、操作限制、運維技巧與避坑指南。
-- 成員表(按年分表)
CREATE TABLE log_2023 (
dt DATETIME NOT NULL,
info VARCHAR(100) NOT NULL,
INDEX (dt)
) ENGINE=MyISAM;
-- MERGE 總表
CREATE TABLE log_all (
dt DATETIME NOT NULL,
info VARCHAR(100) NOT NULL,
INDEX (dt)
) ENGINE=MERGE UNION=(log_2023, log_2024) INSERT_METHOD=LAST;
-- 統一查詢
SELECT COUNT(*) FROM log_all;
SELECT YEAR(dt) AS yr, COUNT(*) FROM log_all GROUP BY yr;
| 值 | 行為 | 適用場景 |
|---|---|---|
| NO(預設) | 禁止 INSERT | 純只讀查詢場景 |
| FIRST | 插入 UNION 列表第一張表 | 熱數據寫入最新分表 |
| LAST | 插入 UNION 列表最後一張表 | 歸檔場景,寫入最老分表 |
-- 新增 2025 年分表
CREATE TABLE log_2025 LIKE log_2024;
ALTER TABLE log_all UNION=(log_2023, log_2024, log_2025);
-- 剔除 2023 年分表(先歸檔數據)
ALTER TABLE log_all UNION=(log_2024, log_2025);
-- 可選:DROP TABLE log_2023;
SELECT * FROM merge_tbl WHERE pk=100 僅返回 UNION 列表中第一張表的行。建議: 成員表不定義主鍵,改用唯一索引+應用層保證全局唯一。REPLACE/DELETE 只影響第一張匹配的成員表,可能導致數據不一致。ANALYZE TABLE、CHECK TABLE 等維護命令需逐表執行,MERGE 表本身不支持。| 方案 | 優點 | 缺點 | 推薦場景 |
|---|---|---|---|
| MERGE | 語法簡單、零改造應用 | MyISAM 限制、主鍵坑、已棄用 | 舊系統只讀日誌查詢 |
| 分區表 | 原生支持、透明維護、InnoDB 事務 | 分區鍵限制、DDL 鎖表 | 新系統時間序列數據 |
| 視圖+UNION ALL | 引擎無關、靈活過濾 | 查詢計劃可能劣化、無 INSERT 支持 | 異構表聚合查詢 |
| 中間件分片 | 完全透明、支持跨庫事務 | 架構複雜、運維成本高 | 大規模寫入擴展 |
MERGE 引擎作為歷史產物,在特定只讀聚合場景仍有價值,但新架構設計請優先考慮分區表或中間件分片方案,規避 MyISAM 單點故障與鎖表風險。