Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

MySQL 8.3 Reference Manual  /  ...  /  FEDERATED Storage Engine Notes and Tips

18.8.3 FEDERATED 存储引擎注意事项和技巧

使用 FEDERATED 存储引擎时,您应该注意以下几点:

  • FEDERATED 表可能会被复制到其他副本,但您必须确保副本服务器能够使用在 CONNECTION 字符串(或 mysql.servers 表中的行)中定义的用户/密码组合来连接到远程服务器。

以下项目指示 FEDERATED 存储引擎支持和不支持的功能:

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

  • 远程表必须在您尝试通过 FEDERATED 表访问它之前存在。

  • 可以让一个 FEDERATED 表指向另一个,但您必须小心不要创建循环。

  • 一个 FEDERATED 表不支持通常意义上的索引;因为表数据的访问是远程处理的,因此实际上是远程表使用索引。这意味着,对于一个不能使用任何索引因此需要全表扫描的查询,服务器将从远程表中获取所有行并在本地过滤它们。这将发生,不管使用了什么 WHERELIMIT 子句;这些子句将在返回的行上应用于本地。

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

  • 创建 FEDERATED 表时应小心,因为等效的 MyISAM 或其他表的索引定义可能不受支持。例如,如果表使用了 VARCHARTEXTBLOB 列的索引前缀,创建 FEDERATED 表将失败。

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

    在这个示例中,键前缀与 FEDERATED 引擎不兼容,等效的语句将失败:

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

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

  • 内部实现使用 SELECTINSERTUPDATEDELETE,但不支持 HANDLER

  • FEDERATED 存储引擎支持 SELECTINSERTUPDATEDELETETRUNCATE TABLE 和索引。但它不支持 ALTER TABLE 或任何直接影响表结构的数据定义语言语句,除了 DROP TABLE。当前实现不使用预备语句。

  • FEDERATED 接受 INSERT ... ON DUPLICATE KEY UPDATE 语句,但如果发生重复键违规,语句将失败并返回错误。

  • 事务不受支持。

  • FEDERATED 执行批量插入处理,以便将多行发送到远程表中,从而提高性能。此外,如果远程表是事务性的,它还启用了远程存储引擎来正确地回滚语句以防止错误发生。这个功能有以下限制:

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

    • 批量插入处理不适用于INSERT ... ON DUPLICATE KEY UPDATE

  • 没有办法让FEDERATED引擎知道远程表是否发生了变化。原因是该表必须像一个数据文件一样,从不被数据库系统以外的任何东西写入。否则,局部表中的数据完整性可能会被破坏。

  • 使用CONNECTION字符串时,密码中不能使用'@'字符。可以通过使用CREATE SERVER语句创建服务器连接来绕过这个限制。

  • insert_idtimestamp选项不会传播到数据提供程序。

  • DROP TABLE语句对联邦表的操作仅删除局部表,而不是远程表。

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