使用 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
表格。