15.8.1 FEDERATED 存储引擎概述
使用标准存储引擎之一(例如MyISAM
,CSV
或InnoDB
)创建 table 时,该 table 由 table 定义和关联的数据组成。创建FEDERATED
table 时,table 定义相同,但是数据的物理存储在远程服务器上处理。
FEDERATED
table 包含两个元素:
-
具有数据库 table 的远程服务器,该 table 又由 table 定义(存储在
.frm
文件中)和关联的 table 组成。远程 table 的 table 类型可以是远程mysqld
服务器支持的任何类型,包括MyISAM
或InnoDB
。 -
具有数据库 table 的“本地服务器”,其中 table 定义与远程服务器上对应 table 的定义匹配。table 定义存储在
.frm
文件中。但是,本地服务器上没有数据文件。而是,table 定义包含指向远程 table 的连接字符串。
当在本地服务器上的FEDERATED
table 上执行查询和语句时,通常将在本地数据文件中插入,更新或删除信息的操作将发送到远程服务器以执行,它们在此更新远程服务器上的数据文件或从远程服务器返回匹配的行。
图 15.2“联合 table 结构”中显示了FEDERATED
table 设置的基本结构。
图 15.2 联合 table 结构
当 Client 端发出引用FEDERATED
table 的 SQL 语句时,本地服务器(执行 SQL 语句的地方)和远程服务器(实际存储数据的地方)之间的信息流如下:
-
存储引擎浏览
FEDERATED
table 具有的每一列,并构造一个引用远程 table 的适当 SQL 语句。 -
该语句使用 MySQLClient 端 API 发送到远程服务器。
-
远程服务器处理该语句,本地服务器检索该语句产生的任何结果(受影响的行数或结果集)。
-
如果该语句产生结果集,则每一列都将转换为
FEDERATED
引擎期望的内部存储引擎格式,并可用于将结果显示给发出原始语句的 Client 端。
本地服务器使用 MySQLClient 端 C API 函数与远程服务器通信。它调用mysql_real_query()发送该语句。要读取结果集,它使用mysql_store_result()并使用mysql_fetch_row()一次获取一行。