一. 什麼是merge
引擎
merge儲存引擎把一組
myisam
資料表當做乙個邏輯單元來對待,讓我們可以同時對他們進行查詢。
二. 應用場景
如果需要把日誌紀錄不停的錄入mysql
資料庫,並且每天、每週或者每個月都建立乙個單一的表,而且要時常進行來自多個表的合計查詢,merge
表這時會非常簡單有效。
三. 舉例
假設有如下兩表
[sql]view plain
copy
create
table
`t1` (
`id` int
(10) unsigned
notnull
auto_increment,
`log` varchar
(45) ,
primary
key(`id`)
) engine=myisam;
[sql]view plain
copy
create
table
`t2`(
`id` int
(10) unsigned
notnull
auto_increment,
`log` varchar
(45) ,
primary
key(`id`)
) engine=myisam;
假設t1,t2
中都有如下記錄
+----+-------+
| id | log |
+----+-------+
| 1 | test1 |
| 2 | test2 |
| 3 | test3 |
+----+-------+
建立merge表
[sql]view plain
copy
create
table
`t` (
`id` int
(10) unsigned
notnull
auto_increment,
`log` varchar
(45)
notnull
,
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
資料表結構的各成員資料表必須具有完全一樣的結構。每乙個成員資料表的資料列必須按照同樣的順序定義同樣的名字和型別,索引也必須按照同樣的順序和同樣的方式定義。
四. cookie問答
1)建表時
union
指明的子表如果存在相同主鍵的記錄會怎麼樣?
相同主鍵的記錄會同時存在於merge
中,就像第三節中的例子所示。但如果繼續向
merge
表中插入資料,若資料主鍵已存在則無法插入。換言之,
merge
表只對建表之後的操作負責。
2)若mrege
後存在重複主鍵,按主鍵查詢會是什麼結果?
順序查詢,只出現一條查詢記錄即停止。比如第三節中的例子,如果執行
[sql]view plain
copy
select
* from
t where
id=1;
只會得到結果
+----+--------+
| id | log |
+----+--------+
| 1 | test1 |
+----+--------+
3)直接刪除乙個子表會出現什麼情況,正確刪除的方式是怎樣的?
merge表會被破壞,正確方式是用
alter table
方式先將子表從
merge
表中去除,再刪除子表。
以第三節中的例子為例,執行如下操作
[sql]view plain
copy
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
。檔案內容類似:
t1t2
#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
表存在的一些問題
如果需要把日誌紀錄不停的錄入mysql
資料庫,並且每天、每週或者每個月都建立乙個單一的表,而且要時常進行來自多個表的合計查詢,merge
表這時會非常簡單有效。
Mysql MERGE引擎簡介
利用mysql merge作資料分表儲存 僅myisam儲存引擎支援merge分表 merge儲存引擎把一組myisam資料表當做乙個邏輯單元來對待,讓我們可以同時對他們進行查詢。構成乙個merge資料表結構的各成員myisam資料表必須具有完全一樣的結構。create table test0 ui...
MySQL MERGE儲存引擎 簡介
merge儲存引擎把一組myisam資料表當做乙個邏輯單元來對待,讓我們可以同時對他們進行查詢。構成乙個merge資料表結構的各成員myisam資料表必須具有完全一樣的結構。每乙個成員資料表的資料列必須按照同樣的順序定義同樣的名字和型別,索引也必須按照同樣的順序和同樣的方式定義。假設你有幾個日誌資料...
MySQL MERGE儲存引擎 簡介
merge儲存引擎把一組myisam資料表當做乙個邏輯單元來對待,讓我們可以同時對他們進行查詢。構成乙個merge資料表結構的各成員myisam資料表必須具有完全一樣的結構。每乙個成員資料表的資料列必須按照同樣的順序定義同樣的名字和型別,索引也必須按照同樣的順序和同樣的方式定義。假設你有幾個日誌資料...