標準のストレージエンジン (MyISAM
、CSV
、InnoDB
など) のいずれかを使用してテーブルを作成すると、そのテーブルはテーブルの定義と関連データで構成されます。 FEDERATED
テーブルを作成すると、テーブル定義は同じですが、データの物理ストレージはリモートサーバーで処理されます。
FEDERATED
テーブルは 2 つの要素で構成されます。
データベーステーブルを含むリモートサーバー。これは、(MySQL データディクショナリに格納されている) テーブル定義と関連するテーブルで構成されます。 リモートテーブルのテーブルタイプは、
MyISAM
やInnoDB
を含む、リモートmysqld
サーバーがサポートするいずれのタイプであってもかまいません。データベーステーブルを持つ ローカルサーバー。テーブルの定義は、リモートサーバー上の対応するテーブルの定義に一致します。 テーブル定義はデータディクショナリに格納されます。 ローカルサーバーにデータファイルがありません。 その代わり、テーブル定義にはリモートテーブルをポイントする接続文字列が含まれています。
ローカルサーバーで FEDERATED
テーブルにクエリーやステートメントを実行すると、一般的にローカルデータファイルの情報を挿入、更新、または削除する操作は、実行するために代わりにリモートサーバーに送られ、そこでリモートサーバーのデータファイルを更新したり、リモートサーバーから一致する行を戻したりします。
FEDERATED
テーブルのセットアップの基本的な構造は 図16.2「FEDERATED テーブルの構造」で示します。
FEDERATED
テーブルを参照する SQL ステートメントをクライアントが発行する場合、ローカルサーバー (SQL ステートメントが実行される場所) とリモートサーバー (データが物理的に格納される場所) の間の情報の流れは次のとおりです。
ストレージエンジンは
FEDERATED
テーブルが持つ各カラムを調べて、リモートテーブルを参照する適当な SQL ステートメントを構築します。ステートメントは MySQL クライアント API を使用してリモートサーバーに送られます。
リモートサーバーはステートメントを処理し、ローカルサーバーはステートメントが作成した結果 (影響を受けた行の数や結果セット) を取得します。
ステートメントが結果セットを作成する場合、各カラムは
FEDERATED
エンジンが求める内部ストレージエンジン形式に変換され、元のステートメントを発行したクライアントに結果を表示するために使用できます。
ローカルサーバーは、MySQL クライアントの C API 関数を使用してリモートサーバーと通信します。 mysql_real_query()
を呼び出して、ステートメントを送信します。 結果セットを読み取るために、mysql_store_result()
を使用し、mysql_fetch_row()
を使用して 1 つずつ行をフェッチします。