當您使用其中一個標準儲存引擎(例如 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()
一次擷取一列。