MERGE 存储引擎,也称为 MRG_MyISAM 引擎,是多个相同 MyISAM 表的集合,可作为一个表使用。“相同” 意味着所有表都具有相同的列数据类型和索引信息。您不能合并列顺序不同、对应列数据类型不完全相同或索引顺序不同的 MyISAM 表。但是,任何或所有 MyISAM 表都可以使用 myisampack 压缩。请参阅 第 6.6.6 节,“myisampack — 生成压缩的只读 MyISAM 表”。以下这些表之间的差异并不重要
- 对应列和索引的名称可以不同。 
- 表、列和索引的注释可以不同。 
- 表选项(例如 - AVG_ROW_LENGTH、- MAX_ROWS或- PACK_KEYS)可以不同。
MERGE 表的另一种选择是分区表,它将单个表的各个分区存储在单独的文件中,并允许更有效地执行某些操作。有关更多信息,请参阅 第 26 章,分区。
创建 MERGE 表时,MySQL 会在磁盘上创建一个 .MRG 文件,其中包含用作一个表的底层 MyISAM 表的名称。MERGE 表的表格式存储在 MySQL 数据字典中。底层表不必与 MERGE 表位于同一个数据库中。
您可以在 MERGE 表上使用 SELECT、DELETE、UPDATE 和 INSERT。您必须对映射到 MERGE 表的 MyISAM 表具有 SELECT、DELETE 和 UPDATE 权限。
使用 MERGE 表会带来以下安全问题:如果用户可以访问 MyISAM 表 t,则该用户可以创建一个访问 t 的 MERGE 表 m。但是,如果随后撤销了用户对 t 的权限,则用户可以通过 m 继续访问 t。
使用 DROP TABLE 删除 MERGE 表只会删除 MERGE 规范。底层表不受影响。
要创建 MERGE 表,您必须指定一个 UNION=( 选项,该选项指示要使用的 表列表)MyISAM 表。您还可以选择指定一个 INSERT_METHOD 选项来控制对 MERGE 表的插入操作。使用 FIRST 或 LAST 值分别导致插入操作在第一个或最后一个底层表中进行。如果您没有指定 INSERT_METHOD 选项,或者指定了 NO 值,则不允许对 MERGE 表进行插入操作,尝试进行此操作会导致错误。
以下示例显示了如何创建 MERGE 表
mysql> CREATE TABLE t1 (
    ->    a INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    ->    message CHAR(20)) ENGINE=MyISAM;
mysql> CREATE TABLE t2 (
    ->    a INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    ->    message CHAR(20)) ENGINE=MyISAM;
mysql> INSERT INTO t1 (message) VALUES ('Testing'),('table'),('t1');
mysql> INSERT INTO t2 (message) VALUES ('Testing'),('table'),('t2');
mysql> CREATE TABLE total (
    ->    a INT NOT NULL AUTO_INCREMENT,
    ->    message CHAR(20), INDEX(a))
    ->    ENGINE=MERGE UNION=(t1,t2) INSERT_METHOD=LAST;列 a 在底层 MyISAM 表中被索引为 PRIMARY KEY,但在 MERGE 表中没有索引。它在该表中被索引,但不是 PRIMARY KEY,因为 MERGE 表不能对底层表集强制唯一性。(同样,在底层表中具有 UNIQUE 索引的列应在 MERGE 表中被索引,但不能作为 UNIQUE 索引。)
创建 MERGE 表后,您可以使用它来发出对整个表组执行操作的查询
mysql> SELECT * FROM total;
+---+---------+
| a | message |
+---+---------+
| 1 | Testing |
| 2 | table   |
| 3 | t1      |
| 1 | Testing |
| 2 | table   |
| 3 | t2      |
+---+---------+要将 MERGE 表重新映射到不同的 MyISAM 表集合,您可以使用以下方法之一
- DROP- MERGE表并重新创建它。
- 使用 - ALTER TABLE更改底层表的列表。- tbl_nameUNION=(...)- 也可以使用 - ALTER TABLE ... UNION=()(即使用空的- UNION子句)删除所有底层表。但是,在这种情况下,该表实际上是空的,插入操作会失败,因为没有底层表可以接收新行。这样的表可能用作使用- CREATE TABLE ... LIKE创建新- MERGE表的模板。
底层表的定义和索引必须与 MERGE 表的定义密切匹配。当打开作为 MERGE 表一部分的表时(而不是创建 MERGE 表时)会检查一致性。如果任何表未通过一致性检查,则触发表打开的操作将失败。这意味着,当访问 MERGE 表时,对 MERGE 中表的定义所做的更改可能会导致失败。应用于每个表的一致性检查是
- 底层表和 - MERGE表必须具有相同数量的列。
- 底层表和 - MERGE表中的列顺序必须匹配。
- 此外,将比较父 - MERGE表和底层表中每个对应列的规范,并且必须满足以下检查- 底层表和 - MERGE表中的列类型必须相等。
- 底层表和 - MERGE表中的列长度必须相等。
- 底层表和 - MERGE表的列可以是- NULL。
 
- 底层表必须至少具有与 - MERGE表一样多的索引。底层表可以具有比- MERGE表更多的索引,但不能更少。注意- 存在一个已知问题,即对相同列的索引在 - MERGE表和底层- MyISAM表中都必须按相同的顺序排列。请参阅错误 #33653。- 每个索引都必须满足以下检查 - 底层表和 - MERGE表的索引类型必须相同。
- 索引定义中索引部分的数量(即复合索引中的多个列)在底层表和 - MERGE表中必须相同。
- 对于每个索引部分 - 索引部分长度必须相等。 
- 索引部分类型必须相等。 
- 索引部分语言必须相等。 
- 检查索引部分是否可以是 - NULL。
 
 
如果由于底层表的问题,MERGE 表无法打开或使用,则 CHECK TABLE 会显示有关哪个表导致问题的相关信息。
其他资源
- 专门针对 - MERGE存储引擎的论坛位于 https://forums.mysql.com/list.php?93。