MySQL MERGE存储引擎

MERGE存储引擎把一组MyISAM数据表当做一个逻辑单元来对待,让我们可以同时对他们进行查询,是一种简单的分表方案。

例如将日志表按日期分为 log_20221103, log_20221104 两张表

1
2
3
4
5
6
7
8
9
10
11
CREATE TABLE `log_20221103` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`log` varchar(45) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=latin1;

CREATE TABLE `log_20221104` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`log` varchar(45) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=latin1;

分别插入数据:

log_20221103:

id log
1 1
2 2
3 3

log_20221104:

id log
1 a
2 b
3 c

创建Merge表:

1
2
3
4
5
6
7
8
9
10
11
12
CREATE TABLE `log_merge` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`log` varchar(45) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MRG_MyISAM DEFAULT CHARSET=latin1 INSERT_METHOD=LAST UNION=(`log_20221103`,`log_20221104`);
/**
解释:
1)ENGINE=MERGE 指明使用MERGE引擎。
2)UNION=(`log_20221103`,`log_20221104`) 指明了MERGE表中挂接了些哪表,可以通过alter table (如移除基础表log_20221104: ALTER TABLE `log_merge` UNION = (`log_20221103`);)的方式修改UNION的值,以实现增删MERGE表子表的功能。
3)INSERT_METHOD=LAST 指明往merge表插入方式,取值可以是:0 不允许插入;FIRST 插入到UNION中的第一个表; LAST 插入到UNION中的最后一个表。
4)MERGE表及构成MERGE数据表结构的各成员数据表必须具有完全一样的结构。每一个成员数据表的数据列必须按照同样的顺序定义同样的名字和类型,索引也必须按照同样的顺序和同样的方式定义。
**/

执行select * from log_merge 将会得到如下结果:

id log
1 1
2 2
3 3
1 a
2 b
3 c

从效果上看,两张表记录如同union在一起了一样, 但是需要注意的是:

1. 此表结构必须与基本表完全一致,包括列名、顺序。UNION表必须同属一个DATABASE。
2. 此表类似于SQL中的union机制。
3. 基本表类型必须是MyISAM的。
4. 可以通过修改.mrg文件来修改MERGE表,每个基本表的名字占一行。注意:修改后要通过FLUSH TABLES刷新表缓存。
5. 对基本表的更改可以直接反映在此表上。
6. INSERT_METHOD的取值可以是: 0 不允许插入 FIRST 插入到UNION中的第一个表 LAST 插入到UNION中的最后一个表。(4.0之后可用)
7. 定义在它上面的约束没有任何作用,约束是由基本表控制的,例如两个基本表中存在着同样的一个Key值,那么在MERGE表中会有两个一样的Key值。
8. 在数据量、查询量较大的情况下, 使用Merge表会很影响性能,原因参考2。
9. 查询结果及顺序与创建Merge表时联合表的顺序有关。
10. 当key一样的时候,修改Merge表内容会影响key对应的第一条数据,和9有关。
11. TRUNCATE Merge表的时候会同时truncate基础表,请慎重操作。 但是DELETE merge表的时候对基础表是没有影响的。

关注作者公众号,获取更多资源!
赏作者一杯咖啡~