Documentation Home
MySQL 8.0 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 36.1Mb
PDF (A4) - 36.2Mb


MySQL 8.0 リファレンスマニュアル  /  ...  /  ビュー処理アルゴリズム

このページは機械翻訳したものです。

25.5.2 ビュー処理アルゴリズム

CREATE VIEW または ALTER VIEW のオプションの ALGORITHM 句は、標準 SQL に対する MySQL 拡張です。 これは、MySQL によるビューの処理方法に影響を与えます。 ALGORITHM は、MERGETEMPTABLE、または UNDEFINED の 3 つの値を受け取ります。

  • MERGE の場合、ビューを参照するステートメントのテキストとビュー定義がマージされ、ビュー定義の部分が対応するステートメントの部分と置き換えられます。

  • TEMPTABLE の場合、ビューの結果が一時テーブル内に取得され、その後、ステートメントを実行するために使用されます。

  • UNDEFINED の場合、MySQL は使用するアルゴリズムを選択します。 できるかぎり TEMPTABLE より MERGE が優先されます。これは通常、MERGE のほうが効率性が高く、一時テーブルを使用するとビューを更新できなくなるためです。

  • ALGORITHM 句が存在しない場合、デフォルトのアルゴリズムは optimizer_switch システム変数の derived_merge フラグの値によって決定されます。 詳細は、セクション8.2.2.4「マージまたは実体化を使用した導出テーブル、ビュー参照および共通テーブル式の最適化」を参照してください。

TEMPTABLE を明示的に指定する理由は、一時テーブルの作成後、ステートメントの処理を終了するために使用する前に、基礎となるテーブルでロックを解放できるためです。 その結果、MERGE アルゴリズムよりもすみやかにロックが解除され、ビューを使用するほかのクライアントが長時間ブロックされることがなくなります。

次の 3 つの理由によって、ビューアルゴリズムをUNDEFINED にできます。

  • CREATE VIEW ステートメントの中に ALGORITHM 句が存在しない。

  • CREATE VIEW ステートメントに明示的な ALGORITHM = UNDEFINED 句が含まれている。

  • 一時テーブルだけでしか処理できないビューに対して、ALGORITHM = MERGE が指定されている。 この場合、MySQL は警告を発し、アルゴリズムを UNDEFINED に設定します。

前述のように、MERGE は、ビュー定義の対応する部分を、ビューを参照するステートメントにマージして処理されます。 次の例で、MERGE アルゴリズムの動作について簡単に説明します。 例では、次の定義を含むビュー v_merge が存在していると想定します。

CREATE ALGORITHM = MERGE VIEW v_merge (vc1, vc2) AS
SELECT c1, c2 FROM t WHERE c3 > 100;

例 1: 次のステートメントを発行するとします。

SELECT * FROM v_merge;

MySQL は次のようにステートメントを処理します。

  • v_merget になる

  • *vc1, vc2 となり、c1, c2 と一致する

  • ビュー WHERE 句が追加される

結果が実行されるステートメントは次のようになります。

SELECT c1, c2 FROM t WHERE c3 > 100;

例 2: 次のステートメントを発行するとします。

SELECT * FROM v_merge WHERE vc1 < 100;

このステートメントは、前述のステートメントと同様に処理されますが、vc1 < 100c1 < 100 になり、AND 連結詞を使用してビュー WHERE 句がステートメント WHERE 句に追加される点が異なります (また、句の一部が確実に正しい優先順位で実行されるように、かっこが追加されます)。 結果が実行されるステートメントは次のようになります。

SELECT c1, c2 FROM t WHERE (c3 > 100) AND (c1 < 100);

事実上、実行されるステートメントには、次の形式の WHERE 句が含まれます。

WHERE (select WHERE) AND (view WHERE)

MERGE アルゴリズムを使用できない場合、一時テーブルを代わりに使用する必要があります。 マージを防止する構成要素は、導出テーブルおよび共通テーブル式でのマージを防止する構成要素と同じです。 例として、サブクエリー内の SELECT DISTINCT または LIMIT があります。 詳細は、セクション8.2.2.4「マージまたは実体化を使用した導出テーブル、ビュー参照および共通テーブル式の最適化」を参照してください。