使用 FEDERATED
存储引擎时,您应该注意以下几点:
-
FEDERATED
表可能会被复制到其他副本,但您必须确保副本服务器能够使用在CONNECTION
字符串(或mysql.servers
表中的行)中定义的用户/密码组合来连接到远程服务器。
以下项目指示 FEDERATED
存储引擎支持和不支持的功能:
-
远程服务器必须是一个 MySQL 服务器。
-
远程表必须在您尝试通过
FEDERATED
表访问它之前存在。 -
可以让一个
FEDERATED
表指向另一个,但您必须小心不要创建循环。 -
一个
FEDERATED
表不支持通常意义上的索引;因为表数据的访问是远程处理的,因此实际上是远程表使用索引。这意味着,对于一个不能使用任何索引因此需要全表扫描的查询,服务器将从远程表中获取所有行并在本地过滤它们。这将发生,不管使用了什么WHERE
或LIMIT
子句;这些子句将在返回的行上应用于本地。不能使用索引的查询可能会导致性能不佳和网络过载。此外,由于返回的行必须存储在内存中,这样的查询也可能导致本地服务器交换或甚至挂起。
-
创建
FEDERATED
表时应小心,因为等效的MyISAM
或其他表的索引定义可能不受支持。例如,如果表使用了VARCHAR
、TEXT
或BLOB
列的索引前缀,创建FEDERATED
表将失败。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
语句创建服务器连接来绕过这个限制。 -
对
DROP TABLE
语句对联邦表的操作仅删除局部表,而不是远程表。 -
用户定义的分区不支持
FEDERATED
表。