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