1. 程式人生 > >MYSQL: MERGE引擎實現多分表的聯合

MYSQL: MERGE引擎實現多分表的聯合

MERGE儲存引擎把一組MyISAM資料表當做一個邏輯單元來對待,讓我們可以同時對他們進行查詢。構成一個MERGE資料表結構的各成員MyISAM資料表必須具有完全一樣的結構。每一個成員資料表的資料列必須按照同樣的順序定義同樣的名字和型別,索引也必須按照同樣的順序和同樣的方式定義。

假設你有幾個日誌資料表,他們內容分別是這幾年來每一年的日誌記錄項,他們的定義都是下面這樣,YY代表年份:

 

CREATE TABLE log_YY
(
  dt  DATETIME NOT NULL,
  info VARCHAR(100) NOT NULL,
  INDEX (dt)
) ENGINE = MyISAM;


假設日誌資料表的當前集合包括 log_2004、log_2005、log_2006、log_2007 ,而你可以建立一個如下所示的MERGE資料表把他們歸攏為一個邏輯單元:

 

 

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);


ENGINE選項的值必須是MERGE,UNION選項列出了將被收錄在這個MERGE資料表離得各有關資料表。把這個MERGE創建出來後,就可以像對待任何其他資料表那樣查詢它,只是每一次查詢都將同時作用與構成它的每一個成員資料表 。

下面這個查詢可以讓我們知道上述幾個日誌資料表的資料行的總數:

 

 

SELECT COUNT(*) FROM log_merge;


下面這個查詢用來確定在這幾年裡每年各有多少日誌記錄項:

 

SELECT YEAR(dt) AS y, COUNT(*) AS entries FROM log_merge GROUP BY y;


除了便於同時引用多個數據表而無需發出多條查詢,MERGE資料表還提供了以下一些便利。

 

 

  • MERGE資料表可以用來建立一個尺寸超過各個MyISAM資料表所允許的最大長度邏輯單元
  • 你看一把經過壓縮的資料表包括到MERGE資料表裡。比如說,在某一年結束之後,你應該不會再往相應的日誌檔案裡新增記錄,所以你可以用myisampack工具壓縮它以節省空間,而MERGE資料表仍可以像往常那樣工作

 

MERGE資料表也支援DELETE 和UPDATE操作。INSERT操作比較麻煩,因為MySQL需要知道應該把新資料行插入到哪一個成員表裡去。在MERGE資料表的定義裡可以包括一個INSERT_METHOD選項,這個選項的可取值是NO、FIRST、LAST,他們的含義依次是INSERT操作是被禁止的、新資料行將被插入到現在UNION選項裡列出的第一個資料表或最後一個數據表。比如說,以下定義將對log_merge資料表的INSERT操作被當作對log_2007資料表----它是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_2009並讓他有同樣的表結構,然後修改log_merge資料表把log_2009包括進來:

 

 

log_2009:
CREATE TABLE log_2009 LIKE log_2008;
ALTER TABLE log_merge
UNION = (log_2004, log_2005, log_2006, log_2007,log_2008,log_2009);