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