Mysql MERGE引擎分表

2021-09-23 21:50:02 字數 4270 閱讀 8922

一. 什麼是merge引擎

merge儲存引擎把一組myisam資料表當做乙個邏輯單元來對待,讓我們可以同時對他們進行查詢。

二. 應用場景

如果需要把日誌紀錄不停的錄入mysql資料庫,並且每天、每週或者每個月都建立乙個單一的表,而且要時常進行來自多個表的合計查詢,merge表這時會非常簡單有效。

三. 舉例

假設有如下兩表

1

2

3

4

5

<

span

style

=「 font

-size

:medium

;「 >

create

table`t1

`(`id`

int(10)

unsigned

notnull

auto_increment,

`log`

varchar(45

),primary

key(`id`))

engine

=myisam

;<

/span

>

1

2

3

4

5

<

span

style

=「 font

-size

:medium

;「 >

create

table`t2

`(`id`

int(10)

unsigned

notnull

auto_increment,

`log`

varchar(45

),primary

key(`id`))

engine

=myisam

;<

/span

>

假設t1,t2中都有如下記錄

+—-+——-+

| id | log |

+—-+——-+

| 1 | test1 |

| 2 | test2 |

| 3 | test3 |

+—-+——-+

建立merge表

1

2

3

4

5

<

span

style

=「 font

-size

:medium

;「 >

create

table`t

`(`id`

int(10)

unsigned

notnull

auto_increment,

`log`

varchar(45

)not

null,

primary

key(`id`))

engine

=merge

union=(

t1,t2)

insert_method

=last

;<

/span

>

執行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後存在重複主鍵,按主鍵查詢會是什麼結果?

順序查詢,只出現一條查詢記錄即停止。比如第三節中的例子,如果執行

1

<

span

style

=「 font

-size

:medium

;「 >

select

*from

twhereid=

1;<

/span

>

只會得到結果

+—-+——–+

| id | log |

+—-+——–+

| 1 | test1 |

+—-+——–+

3)直接刪除乙個子表會出現什麼情況,正確刪除的方式是怎樣的?

merge表會被破壞,正確方式是用alter table方式先將子表從merge表中去除,再刪除子表。

以第三節中的例子為例,執行如下操作

1

<

span

style

=「 font

-size

:medium

;「 >

alter

table

tengine

=mrg_myisam

union=(

t1)insert_method

=last

;<

/span

>

可以從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引擎簡介

一.什麼是merge 引擎 merge儲存引擎把一組 myisam 資料表當做乙個邏輯單元來對待,讓我們可以同時對他們進行查詢。二.應用場景 如果需要把日誌紀錄不停的錄入mysql 資料庫,並且每天 每週或者每個月都建立乙個單一的表,而且要時常進行來自多個表的合計查詢,merge 表這時會非常簡單有...

MySQL Merge儲存引擎

merge儲存引擎同意將一組使用myisam儲存引擎的而且表結構同樣 即每張表的字段順序 欄位名稱 字段型別 索引定義的順序及其定義的方式必須同樣 的資料表合併為乙個表,方便了資料的查詢。如果有log 2004 log 2005 log 2006 log 2007 這四張日誌記錄表,其資料各自是每一...

Mysql MERGE引擎簡介

利用mysql merge作資料分表儲存 僅myisam儲存引擎支援merge分表 merge儲存引擎把一組myisam資料表當做乙個邏輯單元來對待,讓我們可以同時對他們進行查詢。構成乙個merge資料表結構的各成員myisam資料表必須具有完全一樣的結構。create table test0 ui...