一. 什麼是MERGE引擎
MERGE存儲引擎把一組MyISAM數據表當作一個邏輯單元來對待,讓咱們能夠同時對他們進行查詢。html
二. 應用場景
若是須要把日誌紀錄不停的錄入MySQL數據庫,而且天天、每週或者每月都建立一個單一的表,並且要時常進行來自多個表的合計查詢,MERGE表這時會很是簡單有效。mysql
三. 舉例
假設有以下兩表sql
CREATE TABLEt1
(
id
int(10) unsigned NOT NULL AUTO_INCREMENT,
log
varchar(45) ,
PRIMARY KEY (id
)
) ENGINE=MyISAM;
CREATE TABLEt2
(
id
int(10) unsigned NOT NULL AUTO_INCREMENT,
log
varchar(45) ,
PRIMARY KEY (id
)
) ENGINE=MyISAM;
假設t1,t2中都有以下記錄 |
---|
| id | log |數據庫
| 1 | test1 |安全
| 2 | test2 |日誌
| 3 | test3 |code
創建MERGE表htm
CREATE TABLEt
(
id
int(10) unsigned NOT NULL AUTO_INCREMENT,
log
varchar(45) NOT NULL,
PRIMARY KEY (id
)
) ENGINE=MERGE UNION=(t1, t2) INSERT_METHOD=LAST;
執行select * from t;將會獲得以下結果索引
id | log |
---|---|
1 | test1 |
2 | test2 |
3 | test3 |
1 | test1 |
2 | test2 |
3 | test3 |
從效果上看,t1,t2的記錄如同在一張表裏同樣被羅列了出來。固然,看了這個結果你必定會有一些疑問,在下一節裏咱們會慢慢解釋。如今咱們主要來解釋一下上面MERGE表的建表語句。
1)ENGINE=MERGE
指明使用MERGE引擎,有些同窗可能見到過ENGINE=MRG_MyISAM的例子,也是對的,它們是一回事。
2)UNION=(t1, t2)
指明瞭MERGE表中掛接了些哪表,能夠經過alter table的方式修改UNION的值,以實現增刪MERGE表子表的功能。
3)INSERT_METHOD=LAST
INSERT_METHOD指明插入方式,取值能夠是:0 不容許插入;FIRST 插入到UNION中的第一個表; LAST 插入到UNION中的最後一個表。
4)MERGE表及構成MERGE數據表結構的各成員數據表必須具備徹底同樣的結構。每個成員數據表的數據列必須按照一樣的順序定義一樣的名字和類型,索引也必須按照一樣的順序和一樣的方式定義。get
四. Cookie問答
1)建表時UNION指明的子表若是存在相同主鍵的記錄會怎麼樣?
相同主鍵的記錄會同時存在於MERGE中,就像第三節中的例子所示。但若是繼續向MERGE表中插入數據,若數據主鍵已存在則沒法插入。換言之,MERGE表只對建表以後的操做負責。
2)若MREGE後存在重複主鍵,按主鍵查詢會是什麼結果?
順序查詢,只出現一條查詢記錄即中止。好比第三節中的例子,若是執行
select * from t where id=1;
只會獲得結果
id | log |
---|---|
1 | test1 |
3)直接刪除一個子表會出現什麼狀況,正確刪除的方式是怎樣的?
MERGE表會被破壞,正確方式是用alter table方式先將子表從MERGE表中去除,再刪除子表。
以第三節中的例子爲例,執行以下操做
alter table t ENGINE=MRG_MyISAM UNION=(t1) INSERT_METHOD=LAST;
能夠從MERGE表中去除t2,這裏你能夠安全的對t2進行任何操做了。
4)誤刪子表時,如何恢復MERGE表?
誤刪子表時,MERGE表上將沒法進行任何操做。
方法1,drop MERGE表,重建。重建時注意在UNION部分去掉誤刪的子表。
方法2,創建MERGE表時,會在數據庫目錄下生成一個.MRG文件,好比設表名爲t,則文件名爲t.MRG。
文件內容相似:
t1
t2
指明瞭MGEGE表的子表構成及插入方式。
能夠直接修改此文件,去掉誤刪表的表名。而後執行flush tables便可修復MERGE表。
5)MERGE的子表中以前有記錄,且有自增主鍵,則MERGE表建立後,向其插入記錄時主鍵以什麼規則自增?
以各表中的AUTO_INCREMENT最大值作爲下一次插入記錄的主鍵值。
好比t1的自增ID至6,t2至4,則建立MERGE表後,插入的下一條記錄ID將會是7
6)兩個結構徹底相同的但已存在數據的表,是否必定能夠合成一個MEREGE表?
從實驗的結果看,不是這樣的,有時建立出的表,沒法進行任何操做。
因此,推薦的使用方法是先有一個MERGE表,裏面只包含一張表,當一個這個表的的大小增加到必定程度(好比200w)時,建立另外一張空表,將其掛入MERGE表,而後繼續插入記錄。
7)刪除MERGE表是否會對子表產生影響?
不會
8)MREGE表的子表的ENGIN是否有要求?
有的,必須是MyISAM表
附:
官方給出的關於MERGE表存在的一些問題
http://dev.mysql.com/doc/refm...若是須要把日誌紀錄不停的錄入MySQL數據庫,而且天天、每週或者每月都建立一個單一的表,並且要時常進行來自多個表的合計查詢,MERGE表這時會很是簡單有效。