使用 FEDERATED
存储引擎时,您应该注意以下几点。
FEDERATED
表可以复制到其他副本,但您必须确保副本服务器能够使用CONNECTION
字符串(或mysql.servers
表中的行)中定义的用户/密码组合连接到远程服务器。
以下项目指示 FEDERATED
存储引擎支持和不支持的功能
远程服务器必须是 MySQL 服务器。
在尝试通过
FEDERATED
表访问表之前,FEDERATED
表指向的远程表 必须 存在。一个
FEDERATED
表可以指向另一个表,但您必须小心,不要创建循环。FEDERATED
表不支持通常意义上的索引;由于对表数据的访问是在远程处理的,实际上是远程表使用索引。这意味着,对于无法使用任何索引因此需要完全表扫描的查询,服务器会从远程表获取所有行并在本地进行筛选。这与针对此SELECT
语句使用的任何WHERE
或LIMIT
无关;这些子句是针对返回的行在本地应用的。因此,无法使用索引的查询会导致性能下降和网络过载。此外,由于返回的行必须存储在内存中,因此此类查询还会导致本地服务器交换,甚至挂起。
在创建
FEDERATED
表时,应谨慎操作,因为等效MyISAM
或其他表的索引定义可能不受支持。例如,如果表使用任何VARCHAR
、TEXT
或BLOB
列的索引前缀,则创建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';
如果可能,您应该尝试在远程服务器和本地服务器上创建表时分别定义列和索引,以避免这些索引问题。
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
语句创建服务器连接来解决此限制。针对
FEDERATED
表发出的任何DROP TABLE
语句只删除本地表,不删除远程表。不支持
FEDERATED
表的用户定义分区。