FEDERATED
ストレージエンジンを使用するときは、次の点に注意することをお勧めします。
FEDERATED
テーブルをほかのスレーブに複製してもかまいませんが、スレーブサーバーがCONNECTION
文字列 (またはmysql.servers
テーブルの行) で定義されたユーザーとパスワードの組み合わせを使用してリモートサーバーに接続できることを確認する必要があります。
次の項目は、FEDERATED
ストレージエンジンがサポートしている機能とサポートしていない機能を示します。
リモートサーバーは MySQL サーバーでなくてはいけません。
FEDERATED
テーブルがポイントするリモートテーブルは、FEDERATED
テーブルを介してそのテーブルにアクセスを試みる前に、存在している必要があります。ある
FEDERATED
テーブルがほかのテーブルをポイントすることは可能ですが、ループを作らないように注意する必要があります。-
FEDERATED
テーブルは本質的にインデックスをサポートしていません。テーブルへのアクセスがリモートで処理されるため、リモートテーブルがインデックスをサポートします。同等のMyISAM
やほかのテーブルからのインデックス定義がサポートされていない可能性があるため、FEDERATED
テーブルを作成するときは注意を払うようにしてください。たとえば、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';
可能であれば、これらのインデックスの問題を回避するため、リモートサーバーとローカルサーバーの両方にテーブルを作成する場合、カラムとインデックスの定義を分けるようにしてください。
内部的に、実装は
SELECT
、INSERT
、UPDATE
、およびDELETE
を使用しますが、HANDLER
は使用しません。FEDERATED
ストレージエンジンは、SELECT
、INSERT
、UPDATE
、DELETE
、TRUNCATE TABLE
、およびインデックスをサポートしています。DROP TABLE
を除いて、ALTER TABLE
や、テーブルの構造に直接影響を与えるデータ定義言語ステートメントをサポートしていません。現在の実装は、プリペアドステートメントを使用しません。FEDERATED
はINSERT ... ON DUPLICATE KEY UPDATE
ステートメントを受け入れますが、重複キー違反が起こった場合、ステートメントはエラーで失敗します。大量の挿入を実行する場合 (たとえば、
INSERT INTO ... SELECT ...
ステートメント) のFEDERATED
テーブルのパフォーマンスは、選択された各行がFEDERATED
テーブルで個々のINSERT
ステートメントとして処理されるため、ほかのテーブルタイプに比べて低下します。トランザクションはサポートされていません。
-
FEDERATED
は、複数の行がバッチでリモートテーブルに送られるように大量挿入処理を実行します。これでパフォーマンスは向上し、リモートテーブルは改善を実行できます。また、リモートテーブルがトランザクション対応の場合、エラーが発生したときにリモートストレージエンジンはステートメントロールバックを適切に実行できます。この機能には次の制限があります。挿入のサイズは、サーバー間の最大パケットサイズを超えることはできません。挿入がこのサイズを超えた場合、複数のパケットに分割され、ロールバック問題が発生する可能性があります。
大量挿入処理は
INSERT ... ON DUPLICATE KEY UPDATE
では起こりません。
FEDERATED
エンジンは、リモートテーブルが変わったかどうかを知る方法がありません。その理由は、このテーブルが、データベースシステム以外の何かによって決して書き込まれることのないデータファイルのように動作する必要があるためです。リモートデータベースに変更が加えられた場合に、ローカルテーブルのデータの完全性が損なわれる可能性があります。CONNECTION
文字列を使用する場合、パスワードに '@' 文字を使用できません。CREATE SERVER
ステートメントを使用してサーバー接続を作成することで、この制限を回避できます。insert_id
およびtimestamp
オプションはデータプロバイダには伝達されません。FEDERATED
テーブルに対して発行されたDROP TABLE
ステートメントは、ローカルテーブルだけを削除し、リモートテーブルは削除しません。FEDERATED
テーブルはクエリーキャッシュでは機能しません。ユーザー定義のパーティション化は、
FEDERATED
テーブルではサポートされていません。