15.8.3 FEDERATED 存储引擎说明和提示

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

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

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

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

  • FEDERATEDtable 指向*的远程 table 必须存在,然后再尝试通过FEDERATEDtable 访问该 table。

  • 一个FEDERATEDtable 可以指向另一个 table,但是必须小心不要创建循环。

  • FEDERATEDtable 通常不支持索引;因为对 table 数据的访问是远程处理的,所以实际上是使用索引的远程 table。这意味着,对于不能使用任何索引因而需要全 table 扫描的查询,服务器将从远程 table 中获取所有行,并在本地对其进行筛选。无论此SELECT语句使用的是WHERE还是LIMIT,都会发生这种情况;这些子句在本地应用于返回的行。

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

  • 创建FEDERATEDtable 时应格外小心,因为可能不支持来自等效MyISAM或其他 table 的索引定义。例如,创建在VARCHARTEXTBLOB列上具有索引前缀的FEDERATEDtable 将失败。 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';

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

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

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

  • FEDERATED接受插入...在重复的密钥更新上语句,但是如果发生重复键冲突,该语句将失败并显示错误。

  • 不支持 Transaction。

  • FEDERATED执行批量插入处理,以便将多行批量发送到远程 table,从而提高了性能。同样,如果远程 table 是事务性的,则它可以使远程存储引擎在发生错误时正确执行语句回滚。此功能具有以下限制:

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

  • FEDERATED引擎无法知道远程 table 是否已更改。这样做的原因是,该 table 必须像数据文件一样工作,除了数据库系统以外,任何其他文件都不能写入。如果对远程数据库进行任何更改,则可能会破坏本地 table 中数据的完整性。

  • 使用CONNECTION字符串时,不能在密码中使用'@'字符。您可以使用CREATE SERVER语句创建服务器连接来解决此限制。

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

  • 针对FEDERATEDtable 发出的任何DROP TABLE语句仅删除本地 table,而不删除远程 table。

  • FEDERATEDtable 不适用于查询缓存。

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