# MERGE 引擎

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

# 应用场景

如果需要把日志纪录不停的录入 MySQL 数据库,并且每天、每周或者每个月都创建一个单一的表,而且要时常进行来自多个表的合计查询,MERGE 表这时会非常简单有效。

# 举例

先创建分表(引擎必须为 MyISAM)

CREATE TABLE `t1` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
    `log` varchar(45),
    PRIMARY KEY (`id`)
) ENGINE=MyISAM;  
CREATE TABLE `t2`(
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
    `log` varchar(45),
    PRIMARY KEY (`id`)
) ENGINE=MyISAM;

建立 MERGE 主表

CREATE TABLE `t` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
    `log` varchar(45),
    PRIMARY KEY (`id`)
) ENGINE=MERGE UNION=(t1, t2) INSERT_METHOD=LAST;

说明:
1)ENGINE=MERGE
指明使用 MERGE 引擎,ENGINE=MRG_MyISAM 也可。
2)UNION=(t1, t2)
指明了 MERGE 表中挂接了些哪表,可以通过 alter table 的方式修改 UNION 的值,以实现增删 MERGE 表中子表的功能。
3)INSERT_METHOD=LAST
指明插入方式,取值可以是:0 不允许插入;FIRST 插入到 UNION 中的第一个表; LAST 插入到 UNION 中的最后一个表。
4)MERGE 表及构成 MERGE 数据表结构的各成员数据表必须具有完全一样的结构。每一个成员数据表的数据列必须按照同样的顺序定义同样的名字和类型,索引也必须按照同样的顺序和同样的方式定义。

# 数据存储结构

MySQL 中 MyISAM 引擎下每一张表都对应三个文件: .MYD 数据文件,.MYI 索引文件,.FRM 表结构文件。
但是 MERGE 引擎下每一张表只有一个.MRG 文件, MRG 里面存放着分表的关系,以及插入数据的方式。它就像是一个外壳,或者是连接池,数据存放在分表里面。

# 相关操作

1. 删除一个分表
不能直接删除一个分表,这样会破坏 MERGE 表。正确的方法是:

ALTER TABLE t ENGINE=MERGE UNION=(t1) INSERT_METHOD=LAST;
DROP TABLE t2;

2. 修改表结构
不能直接对 MERGE 表或者分表进行 ALERT 操作,这样会造成 MERGE 表和从表结构不一致。正确做法是先从 MERGE 表中去除所有的分表,然后修改分表及主表结构,最后将分表加回主表。

ALTER TABLE t ENGINE=MERGE UNION=() INSERT_METHOD=LAST;
ALTER TABLE t1 xxx; 
ALTER TABLE t2 xxx; 
ALTER TABLE t xxx; 
ALTER TABLE t ENGINE=MERGE UNION=(t1, t2) INSERT_METHOD=LAST;

3. 误删分表时,如何恢复 MERGE 表
误删分表时,MERGE 表上将无法进行任何操作。
方法 1,DROP MERGE 表,重建。重建时注意在 UNION 部分去掉误删的子表。
方法 2,建立 MERGE 表时,会在数据库目录下生成一个.MRG 文件,比如设表名为 t,则文件名为 t.MRG。
文件内容类似:

t1  
t2 
#INSERT_METHOD=LAST

指明了 MGEGE 表的子表构成及插入方式。可以直接修改此文件,去掉误删表的表名。然后执行 FLUSH TABLES 即可修复 MERGE 表。

4. 误删 MERGE 表
误删 MERGE 表,是不会造成数据丢失的,只需重新创建 MERGE 表即可。

# 注意事项

1. 重复记录 / 重复索引
若建立 MERGE 表前,分表 t1/t2 已经存在,并且 t1/t2 中存在重复记录。查询时,遇到满足记录的条目就会返回。意思就是只会显示一条记录,同时不会报错.
若建立 MERGE 表后,INSERT/UPDATE 时,出现重复索引,则会提示错误。MERGE 表只对建表之后的操作负责。

从实验的结果看,两个结构完全相同的但已存在数据的表,不一定可以合成一个 MEREGE 表,有时创建出的表,无法进行任何操作。
所以,推荐的使用方法是先创建一个 MERGE 表,里面只包含一张表,当一个这个表的的大小增长到一定程度(比如 200w)时,创建另一张空表,将其挂入 MERGE 表,然后继续插入记录。

2. 数据插入
数据可以插入 MERGE 表,也可以插入分表中。
① 插入 MERGE 表:会在 MERGE 表及最后一张表中各查询到一条数据。
② 插入分表:若在 t1 及 t2 中各插入一条数据,则会在 MERGE 表中发现两条 id 相同的数据。
MERGE 表是所有分表的集合,即便是有 ID 自增,它也不会对结果做唯一处理。所以,要确保数据唯一性,要么只向主表里面插入数据,要么通过单独建立 ID 表,通过程序来确保数据唯一。

# 总结

优点:
① 分离静态的和动态的数据
② 利用结构接近的的数据来优化查询
③ 查询时可以访问更少的数据
④ 更容易维护大数据集
⑤ 可以动态增加减少子表
缺点:
不支持全文索引还有其它一些 MyISAM 功能。

此文章已被阅读次数:正在加载...更新于

请我喝杯咖啡吧☕️

木亦 微信支付

微信支付

木亦 支付宝

支付宝