MySQL MERGE存儲引擎 簡介及用法

 

MERGE存儲引擎把一組MyISAM數據表當作一個邏輯單元來對待,讓咱們能夠同時對他們進行查詢。構成一個MERGE數據表結構的各成員MyISAM數據表必須具備徹底同樣的結構。每個成員數據表的數據列必須按照一樣的順序定義一樣的名字和類型,索引也必須按照一樣的順序和一樣的方式定義。mysql

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

 

CREATE TABLE log_YY  數據庫

(  緩存

  dt  DATETIME NOT NULL,  工具

  info VARCHAR(100) NOT NULL,  post

  INDEX (dt)  性能

) ENGINE = MyISAM;  大數據

 

假設日誌數據表的當前集合包括 log_200四、log_200五、log_200六、log_2007 ,而你能夠建立一個以下所示的MERGE數據表把他們歸攏爲一個邏輯單元:優化

 

CREATE TABLE log_merge  spa

(  

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

 

MySQL中merge表存儲引擎用法

在Mysql數據庫中,Merge表有點相似於視圖。mysql的merge引擎類型容許你把許多結構相同的表合併爲一個表。以後,你能夠執行查詢,從多個表返回的結果就像從一個表返回的結果同樣。每個合併的表必須有徹底相同表的定義和結構。

 

Mysql Merge表的優勢:

A. 分離靜態的和動態的數據

B. 利用結構接近的的數據來優化查詢

C. 查詢時能夠訪問更少的數據

D. 更容易維護大數據集

E. 能夠經過修改.mrg文件來修改Merge表,固然也能夠用alter進行修改,修改後要經過FLUSH TABLES刷新表緩存,此法能夠動態增長減小子表

若是須要把日誌記錄不停的錄入MySQL數據庫,而且天天、每週或者每月都建立一個 單一的表,並且要製做來自多個表的合計查詢,MERGE表這時會很是有效。然而,這項功能有侷限性。你只能合併MyISAM表並且必須嚴格遵照相同的表定 義的限制。雖然這看起來好像是一個大問題,可是,若是你使用另一種表類型(例如InnoDB),這種合併可能就不須要.
下面定義以下幾個表:

基本表:

CREATE TABLE TEST_MERGE_1(
ID INT(5) NOT NULL,
VALUE VARCHAR(100) NOT NULL,
PRIMARY KEY(ID)
)TYPE=MyISAM;

CREATE TABLE TEST_MERGE_2(
ID INT(5) NOT NULL,
VALUE VARCHAR(100) NOT NULL,
PRIMARY KEY(ID))TYPE=MyISAM;

CREATE TABLE TEST_MERGE(
ID INT(5) NOT NULL,
VALUE VARCHAR(100) NOT NULL,
PRIMARY KEY(ID)
) TYPE=MRG_MyISAM INSERT_METHOD=LAST AUTO_INCREMENT=1 UNION=(TEST_MERGE_1,TEST_MERGE_2);

說明:
1. 此表結構必須與基本表徹底一致,包括列名、順序。UNION表必須同屬一個DATABASE。
2. 此表相似於SQL中的union機制。
3. 基本表類型必須是MyISAM的。
4. 能夠經過修改.mrg文件來修改MERGE表,每一個基本表的名字佔一行。注意:修改後要經過FLUSH TABLES刷新表緩存。
5. 對基本表的更改能夠直接反映在此表上。
6. INSERT_METHOD的取值能夠是: 0 不容許插入 FIRST 插入到UNION中的第一個表 LAST 插入到UNION中的最後一個表。(4.0以後可用)
7. 定義在它上面的約束沒有任何做用,約束是由基本表控制的,例如兩個基本表中存在着一樣的一個Key值,那麼在MERGE表中會有兩個同樣的Key值。

注意:
1.若是是經過修改.mrg文件的方式來修改MERGE表,那麼必定要修改後要經過FLUSH TABLES刷新表緩存,不然修改不會生效。最近犯過一次這樣的錯誤。
2.在數據量、查詢量較大的狀況下,不要試圖使用Merge表來達到相似於Oracle的表分區的功能,會很影響性能。個人感受是和union幾乎等價。
3.查詢結果及順序與建立Merge表時聯合表的順序有關。
假設有這樣兩條個語句:
INSERT INTO TEST_MERGE_1(ID,VALUE) VALUES(1,'ciray');
INSERT INTO TEST_MERGE_2(ID,VALUE) VALUES(1,'blog.csdn.net/ciray');
而後,這個查詢:
SELECT * FROM TEST_MERGE WHERE ID=1;
將 只會獲得一條記錄(1,'ciray'),並非兩條記錄,也不會是(1,'blog.csdn.net/ciray')。這是由於ID是 PRIMARY KEY,若是在第一個表中查詢到記錄,則不在後面的表中記錄查。若是ID並無定義惟一性約束,則這個查詢會獲得兩條記錄。

相關文章
相關標籤/搜索