首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL Merge 引擎詳解:歷史分表聯合查詢的輕量級方案

     編輯:MySQL 綜合教學

什麼是 Merge 引擎

Merge (MRG_MyISAM) 引擎將**結構完全相同**的多張 MyISAM 表在邏輯上合並為一張虛擬表。查詢時自動路由到各子表,返回合併結果。不存儲數據,不支持索引維護,元數據極小。

適用場景

  • 按時間維度分表的歷史日志/流水:log_2022、log_2023、log_2024
  • 只讀/極少寫、需要跨年/跨月聯合統計分析。
  • 避免應用層 UNION ALL 多表查詢的代碼侵入。

創建與使用完整示例

1. 子表定義 (結構必須完全一致)

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;
-- 插入各年數據...

2. 創建 Merge 總表

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 (寫最後一張)。

3. 查詢體驗 (像操作單表)

-- 總行數
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';

4. 動態增減子表

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved