MySQL 8.0 参考手册  / 第 16 章替代存储引擎  / 16.8 联合存储引擎  /  15.8.3 FEDERATED 存储引擎注释和提示

15.8.3 FEDERATED 存储引擎注释和提示

使用 FEDERATED存储引擎需要注意以下几点:

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

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

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

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

  • 一个FEDERATED表可以指向另一个表,但必须注意不要形成循环。

  • FEDERATED表不支持通常意义上的索引 ;因为对表数据的访问是远程处理的,所以实际上是使用索引的远程表。这意味着,对于不能使用任何索引且因此需要全表扫描的查询,服务器会从远程表中获取所有行并在本地过滤它们。无论是否与此声明一起使用,都会发生 WHERE这种LIMIT情况SELECT;这些子句在本地应用于返回的行。

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

  • 创建表时应小心, 因为可能不支持FEDERATED来自等效表或其他表的索引定义。MyISAM例如,创建 FEDERATED具有索引前缀的表对于VARCHAR, TEXTBLOB列失败。中的以下定义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存储引擎支持 , SELECT, INSERT, UPDATE, DELETE, TRUNCATE 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只删除本地表,而不删除远程表。

  • FEDERATED表不适用于查询缓存。

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