CREATE VIEW
または ALTER VIEW
のオプションの ALGORITHM
句は、標準 SQL に対する MySQL 拡張です。 これは、MySQL によるビューの処理方法に影響を与えます。 ALGORITHM
は、MERGE
、TEMPTABLE
、または 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_merge
はt
になる*
はvc1, vc2
となり、c1, c2
と一致するビュー
WHERE
句が追加される
結果が実行されるステートメントは次のようになります。
SELECT c1, c2 FROM t WHERE c3 > 100;
例 2: 次のステートメントを発行するとします。
SELECT * FROM v_merge WHERE vc1 < 100;
このステートメントは、前述のステートメントと同様に処理されますが、vc1 < 100
が c1 < 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「マージまたは実体化を使用した導出テーブル、ビュー参照および共通テーブル式の最適化」を参照してください。