FEDERATED存储引擎注释和提示
使用FEDERATED
存储引擎时,您应该注意以下几点:
FEDERATED
表可以复制到其他从属服务器,但是您必须确保从属服务器能够使用CONNECTION
字符串(或mysql.servers
表中的行)中定义的用户/密码组合连接到远程服务器。
以下各项指示FEDERATED
存储引擎支持和不支持的功能:
- 远程服务器必须是MySQL服务器。
- 在尝试通过表访问该表之前,该
FEDERATED
表指向的远程表必须存在FEDERATED
。 - 一个
FEDERATED
表可能指向另一个表,但是您必须小心不要创建循环。 通常,
FEDERATED
表不支持索引。因为对表数据的访问是远程处理的,所以实际上是使用索引的远程表。这意味着,对于不能使用任何索引因而需要全表扫描的查询,服务器将从远程表中获取所有行,并在本地对其进行筛选。这与任何语句无关WHERE
或LIMIT
与该SELECT
语句一起使用;这些子句在本地应用于返回的行。因此,无法使用索引的查询可能会导致性能下降和网络过载。另外,由于返回的行必须存储在内存中,因此此类查询还可能导致本地服务器交换,甚至挂起。
创建
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 =FEDERATEDCONNECTION ='MYSQL://127.0.0.1:3306/TEST/T1';如果可能,在远程服务器和本地服务器上创建表时,应尝试将列定义和索引定义分开,以避免出现这些索引问题。
- 在内部,实现使用
SELECT
,INSERT
,UPDATE
,和DELETE
,但不会HANDLER
。 - 该
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
语句创建服务器连接来解决此限制。 - 在
insert_id
和timestamp
选项都不会传播到数据提供者。 DROP TABLE
针对FEDERATED
表发出的任何语句仅删除本地表,而不删除远程表。FEDERATED
表不适用于查询缓存。FEDERATED
表不支持用户定义的分区。