相关文档 下载此手册
PDF(US Ltr) - 40.0Mb
PDF(A4) - 40.1Mb
手册页(TGZ) - 258.2Kb
手册页(Zip) - 365.3Kb
Info(Gzip) - 4.0Mb
Info(Zip) - 4.0Mb


MySQL 9.0 参考手册  /  ...  /  FEDERATED 存储引擎注意事项和技巧

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

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

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

以下内容表示 FEDERATED 存储引擎支持和不支持的功能

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

  • FEDERATED 表指向的远程表 必须 在您尝试通过 FEDERATED 表访问该表之前存在。

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

  • FEDERATED 表不支持通常意义上的索引;由于对表数据的访问是在远程处理的,实际上是远程表利用了索引。这意味着,对于不能使用任何索引并且需要进行完全表扫描的查询,服务器会从远程表中获取所有行并在本地进行过滤。无论使用此 SELECT 语句时使用什么 WHERELIMIT,都会发生这种情况;这些子句应用于本地返回的行。

    因此,无法使用索引的查询可能会导致性能低下和网络过载。此外,由于必须将返回的行存储在内存中,因此此类查询还可能导致本地服务器交换甚至挂起。

  • 创建 FEDERATED 表时应谨慎,因为等效 MyISAM 或其他表的索引定义可能不受支持。例如,如果表在任何 VARCHARTEXTBLOB 列上使用索引前缀,则创建 FEDERATED 表会失败。以下使用 MyISAM 的定义是有效的

    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 选项不会传播到数据提供者。

  • 针对 FEDERATED 表发出的任何 DROP TABLE 语句只会删除本地表,而不是远程表。

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