MERGE 引擎 將多張結構完全相同的 MyISAM 表聚合為一個邏輯表,查詢時自動路由到所有成員表。
CREATE TABLE log_2004 (dt DATETIME NOT NULL, info VARCHAR(100) NOT NULL, INDEX(dt)) ENGINE=MyISAM;
CREATE TABLE log_2005 (dt DATETIME NOT NULL, info VARCHAR(100) NOT NULL, INDEX(dt)) ENGINE=MyISAM;
CREATE TABLE log_2006 (dt DATETIME NOT NULL, info VARCHAR(100) NOT NULL, INDEX(dt)) ENGINE=MyISAM;
CREATE TABLE log_2007 (dt DATETIME NOT NULL, info VARCHAR(100) NOT NULL, INDEX(dt)) ENGINE=MyISAM;
CREATE TABLE log_merge (
dt DATETIME NOT NULL,
info VARCHAR(100) NOT NULL,
INDEX(dt)
) ENGINE=MERGE UNION=(log_2004,log_2005,log_2006,log_2007);
-- 總行數
SELECT COUNT(*) FROM log_merge;
-- 按年統計
SELECT YEAR(dt) AS y, COUNT(*) AS entries FROM log_merge GROUP BY y;
-- 範圍查詢
SELECT * FROM log_merge WHERE dt BETWEEN '2005-01-01' AND '2005-12-31';
| 值 | 行為 | 適用場景 |
|---|---|---|
| NO | 禁止 INSERT(默認) | 唯讀聚合視圖 |
| FIRST | 寫入 UNION 列表第一張表 | 熱數據寫最新表 |
| LAST | 寫入 UNION 列表最後一張表 | 歸檔數據寫最舊表 |
CREATE TABLE log_merge (
dt DATETIME NOT NULL,
info VARCHAR(100) NOT NULL,
INDEX(dt)
) ENGINE=MERGE UNION=(log_2004,log_2005,log_2006,log_2007) INSERT_METHOD=LAST;
-- 新數據自動寫入 log_2007
-- 新增 2008 年分表
CREATE TABLE log_2008 LIKE log_2007;
ALTER TABLE log_merge UNION=(log_2004,log_2005,log_2006,log_2007,log_2008);
MERGE 表成員最好不要定義主鍵!
若兩張成員表存在相同主鍵值,通過 MERGE 表按該主鍵查詢,**只會返回 UNION 列表中第一張表的行**,後續表的同鍵行被隱性忽略。
MERGE 引擎為「同結構 MyISAM 表聚合查詢」提供零代碼改造的統一入口,但受限於 MyISAM 無事務、表鎖、主鍵衝突等短板,新架構建議優先考慮原生分區表或分庫中間件。