MERGE存储引擎把一组MyISAM数据表当作一个逻辑单元来对待,让咱们能够同时对他们进行查询。构成一个MERGE数据表结构的各成员MyISAM数据表必须具备彻底同样的结构。每个成员数据表的数据列必须按照一样的顺序定义一样的名字和类型,索引也必须按照一样的顺序和一样的方式定义。sql
举例
假设有以下两表数据库
1 CREATE TABLE `t1` (
2 `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
3 `name` varchar(45) ,
4 PRIMARY KEY (`id`)
5 ) ENGINE=MyISAM;
1 CREATE TABLE `t2`(
2 `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
3 `name` varchar(45) ,
4 PRIMARY KEY (`id`)
5 ) ENGINE=MyISAM;
假设t1,t2中都有以下记录安全
+----+-------+spa
| id | name |code
+----+-------+blog
| 1 | test1 |索引
| 2 | test2 |table
| 3 | test3 |class
+----+-------+test
创建MERGE表
1 CREATE TABLE `t` (
2 `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
3 `name` varchar(45) NOT NULL,
4 PRIMARY KEY (`id`)
5 ) ENGINE=MERGE UNION=(t1, t2) INSERT_METHOD=LAST;
执行select * from t;将会获得以下结果
+----+-------+
| id | name |
+----+-------+
| 1 | test1 |
| 2 | test2 |
| 3 | test3 |
| 1 | test1 |
| 2 | test2 |
| 3 | test3|
+----+-------+
INSERT_METHOD选项:
注意:
常见问题:
1)建表时UNION指明的子表若是存在相同主键的记录会怎么样?
相同主键的记录会同时存在于MERGE中,就像第三节中的例子所示。但若是继续向MERGE表中插入数据,若数据主键已存在则没法插入。换言之,MERGE表只对建表以后的操做负责。
2)若MREGE后存在重复主键,按主键查询会是什么结果?
顺序查询,只出现一条查询记录即中止。执行
1 select * from t where id=1;
只会获得结果
+----+--------+
| id | name |
+----+--------+
| 1 | test1 |
+----+--------+
3)直接删除一个子表会出现什么状况,正确删除的方式是怎样的?
MERGE表会被破坏,正确方式是用alter table方式先将子表从MERGE表中去除,再删除子表。
以第三节中的例子为例,执行以下操做
能够从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表,而后继续插入记录。
也就是说两张表自增id最好不要重复,好比:t1存id存 1-10000 ,t2存10001-20000。
7)删除MERGE表是否会对子表产生影响?
不会
8)MREGE表的子表的ENGIN是否有要求?
有的,必须是MyISAM表