MERGE存儲引擎把一組MyISAM數據表當作一個邏輯單元來對待,讓咱們能夠同時對他們進行查詢。構成一個MERGE數據表結構的各成員MyISAM數據表必須具備徹底同樣的結構。每個成員數據表的數據列必須按照一樣的順序定義一樣的名字和類型,索引也必須按照一樣的順序和一樣的方式定義。sql
舉例
假設有以下兩表數據庫
1 CREATE TABLE `t1` (
2 `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
3 `name` varchar(45) ,
4 PRIMARY KEY (`id`)
5 ) ENGINE=MyISAM;
1 CREATE TABLE `t2`(
2 `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
3 `name` varchar(45) ,
4 PRIMARY KEY (`id`)
5 ) ENGINE=MyISAM;
假設t1,t2中都有以下記錄安全
+----+-------+spa
| id | name |code
+----+-------+blog
| 1 | test1 |索引
| 2 | test2 |table
| 3 | test3 |class
+----+-------+test
創建MERGE表
1 CREATE TABLE `t` (
2 `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
3 `name` varchar(45) NOT NULL,
4 PRIMARY KEY (`id`)
5 ) ENGINE=MERGE UNION=(t1, t2) INSERT_METHOD=LAST;
執行select * from t;將會獲得以下結果
+----+-------+
| id | name |
+----+-------+
| 1 | test1 |
| 2 | test2 |
| 3 | test3 |
| 1 | test1 |
| 2 | test2 |
| 3 | test3|
+----+-------+
INSERT_METHOD選項:
注意:
常見問題:
1)建表時UNION指明的子表若是存在相同主鍵的記錄會怎麼樣?
相同主鍵的記錄會同時存在於MERGE中,就像第三節中的例子所示。但若是繼續向MERGE表中插入數據,若數據主鍵已存在則沒法插入。換言之,MERGE表只對建表以後的操做負責。
2)若MREGE後存在重複主鍵,按主鍵查詢會是什麼結果?
順序查詢,只出現一條查詢記錄即中止。執行
1 select * from t where id=1;
只會獲得結果
+----+--------+
| id | name |
+----+--------+
| 1 | test1 |
+----+--------+
3)直接刪除一個子表會出現什麼狀況,正確刪除的方式是怎樣的?
MERGE表會被破壞,正確方式是用alter table方式先將子表從MERGE表中去除,再刪除子表。
以第三節中的例子爲例,執行以下操做
能夠從MERGE表中去除t2,這裏你能夠安全的對t2進行任何操做了。
4)誤刪子表時,如何恢復MERGE表?
誤刪子表時,MERGE表上將沒法進行任何操做。
方法1,drop MERGE表,重建。重建時注意在UNION部分去掉誤刪的子表。
方法2,創建MERGE表時,會在數據庫目錄下生成一個.MRG文件,好比設表名爲t,則文件名爲t.MRG。
文件內容相似:
t1
t2
#INSERT_METHOD=LAST
指明瞭MGEGE表的子表構成及插入方式。
能夠直接修改此文件,去掉誤刪表的表名。而後執行flush tables便可修復MERGE表。
5)MERGE的子表中以前有記錄,且有自增主鍵,則MERGE表建立後,向其插入記錄時主鍵以什麼規則自增?
以各表中的AUTO_INCREMENT最大值作爲下一次插入記錄的主鍵值。
好比t1的自增ID至6,t2至4,則建立MERGE表後,插入的下一條記錄ID將會是7
6)兩個結構徹底相同的但已存在數據的表,是否必定能夠合成一個MEREGE表?
從實驗的結果看,不是這樣的,有時建立出的表,沒法進行任何操做。
因此,推薦的使用方法是先有一個MERGE表,裏面只包含一張表,當一個這個表的的大小增加到必定程度(好比200w)時,建立另外一張空表,將其掛入MERGE表,而後繼續插入記錄。
也就是說兩張表自增id最好不要重複,好比:t1存id存 1-10000 ,t2存10001-20000。
7)刪除MERGE表是否會對子表產生影響?
不會
8)MREGE表的子表的ENGIN是否有要求?
有的,必須是MyISAM表