Mysql MERGE引擎簡介

2021-08-01 05:49:36 字數 4417 閱讀 9642

一. 什麼是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資料表必須具有完全一樣的結構。每乙個成員資料表的資料列必須按照同樣的順序定義同樣的名字和型別,索引也必須按照同樣的順序和同樣的方式定義。假設你有幾個日誌資料...