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