• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • FEDERATED存储引擎注释和提示

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

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

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

    • 远程服务器必须是MySQL服务器。
    • 在尝试通过表访问该表之前,该FEDERATED表指向的远程表必须存在FEDERATED
    • 一个FEDERATED表可能指向另一个表,但是您必须小心不要创建循环。
    • 通常,FEDERATED表不支持索引。因为对表数据的访问是远程处理的,所以实际上是使用索引的远程表。这意味着,对于不能使用任何索引因而需要全表扫描的查询,服务器将从远程表中获取所有行,并在本地对其进行筛选。这与任何语句无关WHERELIMIT与该SELECT语句一起使用;这些子句在本地应用于返回的行。

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

    • 创建FEDERATED表时应小心,因为MyISAM可能不支持来自等效表或其他表的索引定义。例如,在创建一个FEDERATED与索引表的前缀上VARCHARTEXTBLOB列将失败。中的以下定义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';
      

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

    • 在内部,实现使用SELECTINSERTUPDATE,和DELETE,但不会HANDLER
    • FEDERATED存储引擎支持SELECTINSERTUPDATEDELETETRUNCATE TABLE,和索引。除之外,它不支持ALTER TABLE或任何直接影响表结构的数据定义语言语句DROP TABLE。当前实现不使用准备好的语句。
    • FEDERATED接受INSERT ... ON DUPLICATE KEY UPDATE语句,但是如果发生重复键冲突,该语句将失败并显示错误。
    • 不支持交易。
    • FEDERATED执行批量插入处理,以便将多行批量发送到远程表,从而提高了性能。同样,如果远程表是事务性的,则它可以使远程存储引擎在发生错误时正确执行语句回滚。此功能具有以下限制:

      • 插入的大小不能超过服务器之间的最大数据包大小。如果插入超过此大小,则它将分成多个数据包,并且可能发生回滚问题。
      • 不会进行批量插入处理INSERT ... ON DUPLICATE KEY UPDATE
    • 有没有办法让FEDERATED引擎知道,如果远程表已经改变。这样做的原因是,该表必须像数据文件一样工作,除了数据库系统之外,任何其他文件都不能写入。如果远程数据库发生任何更改,则可能会破坏本地表中数据的完整性。
    • 使用CONNECTION字符串时,不能在密码中使用“@”字符。您可以通过使用CREATE SERVER语句创建服务器连接来解决此限制。
    • insert_idtimestamp选项都不会传播到数据提供者。
    • DROP TABLE针对FEDERATED表发出的任何语句仅删除本地表,而不删除远程表。
    • FEDERATED表不适用于查询缓存。
    • FEDERATED表不支持用户定义的分区。