使用 FEDERATED
儲存引擎時,您應該注意以下幾點:
FEDERATED
資料表可能會複製到其他複本,但您必須確保複本伺服器能夠使用在CONNECTION
字串(或mysql.servers
資料表中的資料列)中定義的使用者/密碼組合,連線至遠端伺服器。
下列項目指出 FEDERATED
儲存引擎支援和不支援的功能:
遠端伺服器必須是 MySQL 伺服器。
FEDERATED
資料表所指向的遠端資料表在您嘗試透過FEDERATED
資料表存取該資料表之前必須存在。一個
FEDERATED
資料表可以指向另一個,但您必須小心不要建立迴圈。FEDERATED
資料表不以一般意義支援索引;由於對資料表的資料存取是遠端處理的,因此實際上是遠端資料表在使用索引。這表示,對於無法使用任何索引而需要完整資料表掃描的查詢,伺服器會從遠端資料表擷取所有資料列,並在本地篩選它們。無論此SELECT
陳述式使用任何WHERE
或LIMIT
,都會發生這種情況;這些子句會在本地應用於傳回的資料列。因此,無法使用索引的查詢可能會導致效能不佳和網路超載。此外,由於傳回的資料列必須儲存在記憶體中,因此這類查詢也可能導致本機伺服器交換,甚至停止回應。
建立
FEDERATED
資料表時應小心,因為可能不支援來自對等MyISAM
或其他資料表的索引定義。例如,如果資料表在任何VARCHAR
、TEXT
或BLOB
資料行上使用索引首碼,則建立FEDERATED
資料表會失敗。以下使用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';
如果可能,您應該嘗試在遠端伺服器和本機伺服器上建立資料表時,將資料行和索引定義分開,以避免這些索引問題。
FEDERATED
儲存引擎支援SELECT
、INSERT
、UPDATE
、DELETE
、TRUNCATE TABLE
和索引。它不支援ALTER TABLE
,或任何會直接影響資料表結構的資料定義語言陳述式,除了DROP TABLE
之外。目前實作不使用預先準備的陳述式。FEDERATED
接受INSERT ... ON DUPLICATE KEY UPDATE
陳述式,但如果發生重複索引鍵違規,則陳述式會失敗並顯示錯誤。不支援交易。
FEDERATED
會執行大量插入處理,以便將多個資料列以批次方式傳送到遠端資料表,這可以提高效能。此外,如果遠端資料表是交易式的,則它會讓遠端儲存引擎在發生錯誤時正確執行陳述式回滾。此功能具有下列限制:插入的大小不能超過伺服器之間的最大封包大小。如果插入超過此大小,則會將其分割成多個封包,並可能發生回滾問題。
大量插入處理不會發生於
INSERT ... ON DUPLICATE KEY UPDATE
。
FEDERATED
引擎無法得知遠端資料表是否已變更。原因在於,此資料表必須像一個資料檔案一樣運作,除了資料庫系統以外的任何東西都永遠不會寫入該檔案。如果遠端資料庫有任何變更,則本機資料表中的資料完整性可能會遭到破壞。使用
CONNECTION
字串時,您無法在密碼中使用 '@' 字元。您可以使用CREATE SERVER
陳述式來建立伺服器連線,以解決此限制。針對
FEDERATED
資料表發出的任何DROP TABLE
陳述式只會卸除本機資料表,而不會卸除遠端資料表。不支援為
FEDERATED
資料表定義使用者分割區。