MERGE
表可以帮助您解决以下问题:
-
轻松管理一组日志表。例如,您可以将不同月份的数据放入单独的表中,用 myisampack 压缩一些表,然后创建一个
MERGE
表来使用它们作为一个。 -
获得更高的速度。您可以根据某些标准将大型只读表分割成小表,然后将单个表放在不同的磁盘上。这样结构的
MERGE
表可能比使用单个大表要快得多。 -
执行更高效的搜索。如果您知道自己正在寻找什么,可以在单个基础表中搜索某些查询,并使用
MERGE
表来搜索其他查询。您甚至可以拥有多个不同的MERGE
表,它们使用重叠的表集。 -
执行更高效的修复。修复单个较小的表比修复单个大表要容易得多。
-
即时映射多个表为一个。
MERGE
表不需要维护自己的索引,因为它使用基础表的索引。因此,MERGE
表集合非常快地创建或重新映射。(您仍然需要在创建MERGE
表时指定索引定义,即使没有创建索引。) -
如果您有一个大表的集合,可以根据需要创建一个
MERGE
表。这比创建一个大表要快得多,并且节省了大量的磁盘空间。 -
超过操作系统的文件大小限制。每个
MyISAM
表都受到这个限制的约束,但MyISAM
表集合不受限制。 -
您可以通过定义一个映射到单个
MyISAM
表的MERGE
表来创建一个别名或同义词。这样做不会对性能产生明显的影响(只有少量的间接调用和memcpy()
调用)。
然而,MERGE
表也存在一些缺点:
-
您只能使用相同的
MyISAM
表来创建MERGE
表。 -
一些
MyISAM
特性在MERGE
表中不可用。例如,您不能在MERGE
表上创建FULLTEXT
索引。(您可以在基础MyISAM
表上创建FULLTEXT
索引,但您不能使用全文搜索来搜索MERGE
表。) -
如果
MERGE
表不是临时的,那么所有基础MyISAM
表也必须不是临时的。如果MERGE
表是临时的,那么MyISAM
表可以是临时的或不是临时的。 -
MERGE
表使用比MyISAM
表更多的文件描述符。如果 10 个客户端使用一个映射到 10 个表的MERGE
表,那么服务器将使用 (10 × 10) + 10 个文件描述符。(10 个数据文件描述符用于每个客户端,和 10 个索引文件描述符共享在客户端之间。) -
索引读取速度较慢。当您读取索引时,
MERGE
存储引擎需要在所有基础表中读取,以检查哪个表最接近给定的索引值。要读取下一个索引值,MERGE
存储引擎需要搜索读取缓冲区以找到下一个值。只有当一个索引缓冲区用完时,存储引擎才需要读取下一个索引块。这使得MERGE
索引在eq_ref
搜索中变得非常慢,但是在ref
搜索中速度并没有太大影响。有关eq_ref
和ref
的更多信息,请参阅 第 15.8.2 节,“EXPLAIN 语句”。