MySQL中merge表存储引擎用法
來(lái)源:http://www.linuxidc.com/Linux/2012-08/67797.htm
在Mysql數(shù)據(jù)庫(kù)中,Merge表有點(diǎn)類似于視圖。mysql的merge引擎類型允許你把許多結(jié)構(gòu)相同的表合并為一個(gè)表。之后,你可以執(zhí)行查詢,從多個(gè)表返回的結(jié)果就像從一個(gè)表返回的結(jié)果一樣。每一個(gè)合并的表必須有完全相同表的定義和結(jié)構(gòu)。
Mysql Merge表的優(yōu)點(diǎn):
A. 分離靜態(tài)的和動(dòng)態(tài)的數(shù)據(jù)
B. 利用結(jié)構(gòu)接近的的數(shù)據(jù)來(lái)優(yōu)化查詢
C. 查詢時(shí)可以訪問(wèn)更少的數(shù)據(jù)
D. 更容易維護(hù)大數(shù)據(jù)集
E. 可以通過(guò)修改.mrg文件來(lái)修改Merge表,當(dāng)然也可以用alter進(jìn)行修改,修改后要通過(guò)FLUSH TABLES刷新表緩存,此法可以動(dòng)態(tài)增加減少子表
merge表存儲(chǔ)引擎在如下這種使用場(chǎng)合會(huì)最為有用:
如果需要把日志記錄不停的錄入MySQL數(shù)據(jù)庫(kù),并且每天、每周或者每個(gè)月都創(chuàng)建一個(gè)單一的表,而且要制作來(lái)自多個(gè)表的合計(jì)查詢,MERGE表這時(shí)會(huì)非常有效。然而,這項(xiàng)功能有局限性。你只能合并MyISAM表而且必須嚴(yán)格遵守相同的表定義的限制。雖然這看起來(lái)好像是一個(gè)大問(wèn)題,但是,如果你使用另外一種表類型(例如InnoDB),這種合并可能就不需要.
下面定義如下幾個(gè)表:
基本表:
CREATE TABLE TEST_MERGE_1(
ID INT(5) NOT NULL,
VALUE VARCHAR(100) NOT NULL,
PRIMARY KEY(ID)
);
CREATE TABLE TEST_MERGE_2(
ID INT(5) NOT NULL,
VALUE VARCHAR(100) NOT NULL,
PRIMARY KEY(ID)
);
MERGE表:
CREATE TABLE TEST_MERGE(
ID INT(5) NOT NULL,
VALUE VARCHAR(100) NOT NULL,
PRIMARY KEY(ID)
) TYPE=MRG_MyISAM INSERT_METHOD=LAST UNION=(TEST_MERGE_1,TEST_MERGE_2);
上面的TYPE=MRG_MyISAM可能在有些mysql版本下面報(bào)錯(cuò),修改成engine?MRG_MyISAM
說(shuō)明:
1. 此表結(jié)構(gòu)必須與基本表完全一致,包括列名、順序。UNION表必須同屬一個(gè)DATABASE。
2. 此表類似于SQL中的union機(jī)制。
3. 基本表類型必須是MyISAM的。
4. 可以通過(guò)修改.mrg文件來(lái)修改MERGE表,每個(gè)基本表的名字占一行。注意:修改后要通過(guò)FLUSH TABLES刷新表緩存。
5. 對(duì)基本表的更改可以直接反映在此表上。
6. INSERT_METHOD的取值可以是: 0 不允許插入 FIRST 插入到UNION中的第一個(gè)表 LAST 插入到UNION中的最后一個(gè)表。(4.0之后可用)
7. 定義在它上面的約束沒(méi)有任何作用,約束是由基本表控制的,例如兩個(gè)基本表中存在著同樣的一個(gè)Key值,那么在MERGE表中會(huì)有兩個(gè)一樣的Key值。
注意:
1.如果是通過(guò)修改.mrg文件的方式來(lái)修改MERGE表,那么一定要修改后要通過(guò)FLUSH TABLES刷新表緩存,否則修改不會(huì)生效。最近犯過(guò)一次這樣的錯(cuò)誤。
2.在數(shù)據(jù)量、查詢量較大的情況下,不要試圖使用Merge表來(lái)達(dá)到類似于Oracle的表分區(qū)的功能,會(huì)很影響性能。我的感覺(jué)是和union幾乎等價(jià)。
3.查詢結(jié)果及順序與創(chuàng)建Merge表時(shí)聯(lián)合表的順序有關(guān)。
假設(shè)有這樣兩條個(gè)語(yǔ)句:
INSERT INTO TEST_MERGE_1(ID,VALUE) VALUES(1,'ciray');
INSERT INTO TEST_MERGE_2(ID,VALUE) VALUES(1,'blog.csdn.net/ciray');
然后,這個(gè)查詢:
SELECT * FROM TEST_MERGE WHERE ID=1;
將只會(huì)得到一條記錄(1,'ciray'),并不是兩條記錄,也不會(huì)是(1,'blog.csdn.net/ciray')。這是因?yàn)镮D是 PRIMARY KEY,如果在第一個(gè)表中查詢到記錄,則不在后面的表中記錄查。如果ID并沒(méi)有定義唯一性約束,則這個(gè)查詢會(huì)得到兩條記錄。
總結(jié)
以上是生活随笔為你收集整理的MySQL中merge表存储引擎用法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: mysql使用MRG_MyISAM(ME
- 下一篇: linux cmake编译源码,linu