一. 什麼是merge引擎
merge存儲引擎把一組myisam資料表當做一個邏輯單元來對待,讓我們可以同時對他們進行查詢。
二. 應用場景
如果需要把日志紀錄不停的錄入mysql資料庫,并且每天、每周或者每個月都建立一個單一的表,而且要時常進行來自多個表的合計查詢,merge表這時會非常簡單有效。
三. 舉例
假設有如下兩表
1
2
3
4
5
<span style=“font-size: medium;“>create table `t1`(
`id` int(10) unsigned not null auto_increment,
`log` varchar(45) ,
primary key (`id`)
) engine=myisam;</span>
<span style=“font-size: medium;“>create table`t2`(
假設t1,t2中都有如下記錄
+—-+——-+
| id | log |
| 1 | test1 |
| 2 | test2 |
| 3 | test3 |
建立merge表
<span style=“font-size: medium;“>create table `t`(
`log` varchar(45) not null,
) engine=merge union=(t1, t2) insert_method=last;</span>
執行select * from t;将會得到如下結果
| 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資料表結構的各成員資料表必須具有完全一樣的結構。每一個成員資料表的資料列必須按照同樣的順序定義同樣的名字和類型,索引也必須按照同樣的順序和同樣的方式定義。
四. cookie問答
1)建表時union指明的子表如果存在相同主鍵的記錄會怎麼樣?
相同主鍵的記錄會同時存在于merge中,就像第三節中的例子所示。但如果繼續向merge表中插入資料,若資料主鍵已存在則無法插入。換言之,merge表隻對建表之後的操作負責。
2)若mrege後存在重複主鍵,按主鍵查詢會是什麼結果?
順序查詢,隻出現一條查詢記錄即停止。比如第三節中的例子,如果執行
<span style=“font-size: medium;“>select * from t where id=1;</span>
隻會得到結果
+—-+——–+
3)直接删除一個子表會出現什麼情況,正确删除的方式是怎樣的?
merge表會被破壞,正确方式是用alter table方式先将子表從merge表中去除,再删除子表。
以第三節中的例子為例,執行如下操作
<span style=“font-size: medium;“>alter table t engine=mrg_myisam union=(t1) insert_method=last;</span>
可以從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表,然後繼續插入記錄。
7)删除merge表是否會對子表産生影響?
不會
8)mrege表的子表的engin是否有要求?
有的,必須是myisam表
附:
官方給出的關于merge表存在的一些問題
http://dev.mysql.com/doc/refman/5.1/zh/storage-engines.html#merge-table-problems