15.7.1 MERGEtable 的优缺点

MERGEtable 可以帮助您解决以下问题:

  • 轻松 Management 一组日志 table。例如,您可以将不同月份的数据放入单独的 table 中,用myisampack压缩其中的一些,然后创建MERGEtable 以将它们用作一个 table。

  • 获得更高的速度。您可以根据某些条件拆分一个大型只读 table,然后将各个 table 放在不同的磁盘上。这样构造的MERGEtable 可能比使用单个大 table 要快得多。

  • 执行更有效的搜索。如果您确切知道要查找的内容,则可以仅在基础 table 之一中搜索某些查询,而在其他 table 中使用MERGEtable。您甚至可以拥有许多使用重叠的 table 集的不同MERGEtable。

  • 执行更有效的维修。修复 Map 到MERGEtable 的单个较小的 table 比修复单个较大的 table 要容易。

  • 立即将多个 tableMap 为一个。 MERGEtable 不需要维护自己的索引,因为它使用各个 table 的索引。结果,MERGE个 table 集合创建或重新 Map 的速度非常快。 (即使未创建索引,创建MERGEtable 时仍必须指定索引定义.)

  • 如果您有一组 table,可以根据需要从中创建一个大 table,则可以根据需要从中创建一个MERGEtable。这快得多,并节省了大量磁盘空间。

  • 超出 os 的文件大小限制。每个MyISAMtable 都受此限制约束,但不是MyISAMtable 的集合。

  • 您可以通过定义 Map 到该单个 table 的MERGEtable 来为MyISAMtable 创建别名或同义词。这样做不会对性能产生任何明显的影响(每次读取仅两次间接调用和memcpy()调用)。

MERGEtable 的缺点是:

  • MERGEtable 只能使用相同的MyISAMtable。

  • 某些MyISAM功能在MERGEtable 中不可用。例如,您不能在MERGEtable 上创建FULLTEXT索引。 (您可以在基础MyISAMtable 上创建FULLTEXT索引,但不能使用全文本搜索来搜索MERGEtable.)

  • 如果MERGEtable 是非临时 table,则所有基础MyISAMtable 都必须是非临时 table。如果MERGEtable 是临时 table,则MyISAMtable 可以是临时 table 和非临时 table 的任意组合。

  • MERGE个 table 比MyISAM个 table 使用更多的文件 Descriptors。如果 10 个 Client 端使用的MERGEtableMap 到 10 个 table,则服务器使用(10×10)10 个文件 Descriptors。 (10 个 Client 端中的每个 Client 端都有 10 个数据文件 Descriptors,并且 Client 端之间共享 10 个索引文件 Descriptors.)

  • 索引读取速度较慢。读取索引时,MERGE存储引擎需要在所有基础 table 上发出读取,以检查哪个 table 最匹配给定索引值。要读取下一个索引值,MERGE存储引擎需要搜索读取缓冲区以找到下一个值。仅当一个索引缓冲区用完时,存储引擎才需要读取下一个索引块。这会使MERGE索引在eq_ref搜索上慢得多,但在ref搜索上却慢很多。有关eq_refref的更多信息,请参见第 13.8.2 节“ EXPLAIN 语句”