18.8.3 FEDERATED 存储引擎注释和提示
使用 FEDERATED
存储引擎时,需要注意以下几点:
-
FEDERATED
表可能会被复制到其他副本服务器,但是你必须确保副本服务器可以使用在CONNECTION
字符串(或mysql.servers
表中的行)中定义的用户/密码组合来连接远程服务器。
以下项目指示了 FEDERATED
存储引擎支持和不支持的特性:
-
远程服务器必须是 MySQL 服务器。
-
FEDERATED
表指向的远程表必须在你尝试通过FEDERATED
表访问该表之前存在。 -
一个
FEDERATED
表可以指向另一个,但是你需要小心不要创建环形引用。 -
FEDERATED
表不支持通常的索引,因为访问表数据是远程处理的,实际上是远程表使用索引。这意味着,对于不能使用任何索引并且需要完整表扫描的查询,服务器将从远程表中fetch所有行然后在本地过滤它们。无论这个SELECT
语句使用了哪些WHERE
或LIMIT
,这些子句都将在返回的行上应用。因此,查询语句如果不能使用索引,就可能会导致性能差和网络过载。此外,因为返回的行必须存储在内存中,这种查询也可能会导致本地服务器交换或挂起。
-
创建
FEDERATED
表时,需要注意索引定义,因为来自等效MyISAM
或其他表的索引定义可能不被支持。例如,创建FEDERATED
表失败,如果该表使用了任何VARCHAR
、TEXT
或BLOB
列的索引前缀。以下使用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
语句来创建服务器连接。 -
DROP TABLE
语句对FEDERATED
表执行时,只删除局部表,不删除远程表。 -
用户定义分区不支持
FEDERATED
表。