Merge (MRG_MyISAM) 引擎將**結構完全相同**的多張 MyISAM 表在邏輯上合並為一張虛擬表。查詢時自動路由到各子表,返回合併結果。不存儲數據,不支持索引維護,元數據極小。
log_2022、log_2023、log_2024UNION ALL 多表查詢的代碼侵入。CREATE TABLE log_2022 (
dt DATETIME NOT NULL,
info VARCHAR(100) NOT NULL,
INDEX (dt)
) ENGINE = MyISAM;
CREATE TABLE log_2023 LIKE log_2022;
CREATE TABLE log_2024 LIKE log_2022;
-- 插入各年數據...
CREATE TABLE log_all (
dt DATETIME NOT NULL,
info VARCHAR(100) NOT NULL,
INDEX (dt)
) ENGINE = MERGE
UNION = (log_2022, log_2023, log_2024)
INSERT_METHOD = LAST; -- 新數據寫入最後一張子表
關鍵參數:
UNION:列出子表名,順序決定 INSERT_METHOD=FIRST/LAST 的目標。INSERT_METHOD:NO (禁止寫入)、FIRST (寫第一張)、LAST (寫最後一張)。-- 總行數 SELECT COUNT(*) FROM log_all; -- 按年統計 SELECT YEAR(dt) AS yr, COUNT(*) AS cnt FROM log_all GROUP BY yr; -- 範圍查詢 (自動裁剪無關分區,MySQL 5.1+ 支持分區裁剪邏輯) SELECT * FROM log_all WHERE dt BETWEEN '2023-06-01' AND '2023-06-30';
限制項 說明 應對 子表必須為 MyISAM 不支持 InnoDB、Archive 等 5.7+ 建議改用**原生分區表** (Partitioning),支持 InnoDB 結構必須完全一致 字段順序、類型、索引定義逐字節一致 用 CREATE TABLE ... LIKE保證一致性不支持主鍵/唯一鍵全局唯一 各子表主鍵可能重複,Merge 查詢返回第一匹配行 業務層保證邏輯主鍵唯一 (如 UUID、雪花 ID),勿依賴自增 PK REPLACE/DELETE/UPDATE 性能差 需定位到具體子表,全表掃描 僅用於「寫入極少、以讀為主」場景 不支持外鍵、事務 繼承 MyISAM 限制 同上 表損壞風險 任一子表損壞影響整體 定期 CHECK TABLE、備份Merge vs 分區表 vs 分片中間件
| 維度 | Merge 引擎 | 原生分區表 (Partitioning) | 分片中間件 (MyCat/ShardingSphere) |
|---|---|---|---|
| 底層引擎 | MyISAM | InnoDB / MyISAM | 任意 (InnoDB 為主) |
| 事務支持 | ❌ | ✅ (InnoDB) | ✅ (分布式事務/最終一致) |
| 索引維護 | 各子表獨立 | 全局/局部索引 | 各分片獨立 |
| 動態增減分區 | ALTER TABLE ... UNION | ALTER TABLE ... ADD/DROP PARTITION | 中間件路由規則動態更新 |
| 跨實例分布 | ❌ (單實例) | ❌ (單實例) | ✅ (核心優勢) |
| 適用規模 | 單機歷史歸檔表 | 單機大表 (TB 級) | 分布式集群 (PB 級) |
ALTER TABLE log_all ENGINE=InnoDB PARTITION BY RANGE (YEAR(dt)) ... (需重建表,大表用 pt-online-schema-change)。Merge 引擎是 MyISAM 時代解決「單機歷史分表聯合查詢」的輕量級妥協方案。**新架構不建議使用**,現有項目應規劃遷移至原生分區表或分片中間件。理解其原理有助於維護舊系統、排查「主鍵衝突導致查詢結果不全」等典型問題。