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

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

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

    以下各项表示功能，`联邦`存储引擎支持和不支持：

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

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

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

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

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

-   制作时应注意`联邦`表，因为索引定义来自等价`MyISAM`或其他表可能不受支持。例如，创建一个`联邦`如果表在任何表上使用索引前缀，表就会失败[`VARCHAR`](char.html),[`文本`](blob.html)要么[`斑点`](blob.html)列。以下定义使用`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';
    ```

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

-   在内部，实现使用[`选择`](select.html),[`插入`](insert.html),[`更新`](update.html)， 和[`删除`](delete.html)， 但不是[`处理程序`](handler.html).

-   这`联邦`存储引擎支持[`选择`](select.html),[`插入`](insert.html),[`更新`](update.html),[`删除`](delete.html),[`截断表`](truncate-table.html), 和索引。它不支持[`更改表`](alter-table.html)，或任何直接影响表结构的数据定义语言语句，除了[`删除表`](drop-table.html).当前的实现不使用准备好的语句。

-   `联邦`接受[`插入 ... 在重复密钥更新时`](insert-on-duplicate.html)语句，但如果发生重复键冲突，该语句将失败并出现错误。

-   不支持交易。

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

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

    -   批量插入处理不会发生[`插入 ... 在重复密钥更新时`](insert-on-duplicate.html).

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

-   当使用一个`联系`字符串，您不能在密码中使用“@”字符。您可以通过使用[`创建服务器`](create-server.html)创建服务器连接的语句。

-   这[`insert_id`](server-system-variables.html#sysvar_insert_id)和[`时间戳`](server-system-variables.html#sysvar_timestamp)选项不会传播到数据提供者。

-   任何[`删除表`](drop-table.html)针对某项发表的声明`联邦`table 只删除本地表，不删除远程表。

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