# 16.8.3 联合存储引擎注意事项和提示

使用时应注意以下几点联邦存储引擎:

  • 联邦表可以复制到其他副本,但您必须确保副本服务器能够使用在联系字符串(或mysql.servers表)连接到远程服务器。

    以下各项表示功能,联邦存储引擎支持和不支持:

  • 远程服务器必须是 MySQL 服务器。

  • 一个远程表联邦表指向必须在您尝试通过联邦桌子。

  • 一个是可能的联邦表指向另一个,但你必须小心不要创建一个循环。

  • 一种联邦table 不支持通常意义上的索引;因为对表数据的访问是远程处理的,所以实际上是远程表使用了索引。这意味着,对于不能使用任何索引并因此需要全表扫描的查询,服务器会从远程表中获取所有行并在本地过滤它们。无论发生这种情况在哪里要么限制与此一起使用选择陈述;这些子句在本地应用于返回的行。

    因此,未能使用索引的查询会导致性能不佳和网络过载。此外,由于返回的行必须存储在内存中,这样的查询也可能导致本地服务器交换,甚至挂起。

  • 制作时应注意联邦表,因为索引定义来自等价MyISAM或其他表可能不受支持。例如,创建一个联邦如果表在任何表上使用索引前缀,表就会失败VARCHAR,文本要么斑点列。以下定义使用MyISAM已验证:

    CREATE TABLE `T1`(`A` VARCHAR(100),UNIQUE KEY(`A`(30))) ENGINE=MYISAM;
    

    此示例中的键前缀与联邦引擎,等效语句失败:

    CREATE TABLE `T1`(`A` VARCHAR(100),UNIQUE KEY(`A`(30))) ENGINE=FEDERATED
      CONNECTION='MYSQL://127.0.0.1:3306/TEST/T1';
    

    如果可能,您应该在远程服务器和本地服务器上创建表时尝试将列和索引定义分开,以避免这些索引问题。

  • 在内部,实现使用选择,插入,更新, 和删除, 但不是处理程序.

  • 联邦存储引擎支持选择,插入,更新,删除,截断表, 和索引。它不支持更改表,或任何直接影响表结构的数据定义语言语句,除了删除表.当前的实现不使用准备好的语句。

  • 联邦接受插入 ... 在重复密钥更新时语句,但如果发生重复键冲突,该语句将失败并出现错误。

  • 不支持交易。

  • 联邦执行批量插入处理,以便将多行批量发送到远程表,从而提高性能。此外,如果远程表是事务性的,它使远程存储引擎能够在发生错误时正确执行语句回滚。此功能具有以下限制:

    • 插入的大小不能超过服务器之间的最大数据包大小。如果插入超过这个大小,它会被分成多个数据包,并且可能会出现回滚问题。

    • 批量插入处理不会发生插入 ... 在重复密钥更新时.

  • 没有办法联邦引擎知道远程表是否已更改。这样做的原因是该表必须像数据文件一样工作,除了数据库系统之外,其他任何东西都不会写入数据文件。如果远程数据库发生任何更改,则可能会破坏本地表中数据的完整性。

  • 当使用一个联系字符串,您不能在密码中使用“@”字符。您可以通过使用创建服务器创建服务器连接的语句。

  • insert_id时间戳选项不会传播到数据提供者。

  • 任何删除表针对某项发表的声明联邦table 只删除本地表,不删除远程表。

  • 不支持用户定义的分区联邦表。