Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


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

18.8.3 FEDERATED 存储引擎注释和提示

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

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

以下项目指示了 FEDERATED 存储引擎支持和不支持的特性:

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

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

  • 一个 FEDERATED 表可以指向另一个,但是你需要小心不要创建环形引用。

  • FEDERATED 表不支持通常的索引,因为访问表数据是远程处理的,实际上是远程表使用索引。这意味着,对于不能使用任何索引并且需要完整表扫描的查询,服务器将从远程表中fetch所有行然后在本地过滤它们。无论这个SELECT 语句使用了哪些 WHERELIMIT,这些子句都将在返回的行上应用。

    因此,查询语句如果不能使用索引,就可能会导致性能差和网络过载。此外,因为返回的行必须存储在内存中,这种查询也可能会导致本地服务器交换或挂起。

  • 创建 FEDERATED 表时,需要注意索引定义,因为来自等效 MyISAM 或其他表的索引定义可能不被支持。例如,创建 FEDERATED 表失败,如果该表使用了任何VARCHARTEXTBLOB 列的索引前缀。以下使用 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 选项不会被传播到数据提供商。

  • DROP TABLE 语句对 FEDERATED 表执行时,只删除局部表,不删除远程表。

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