CREATE VIEW
または ALTER VIEW
のオプションの ALGORITHM
句は、標準 SQL に対する MySQL 拡張です。これは、MySQL によるビューの処理方法に影響を与えます。ALGORITHM
は、MERGE
、TEMPTABLE
、または UNDEFINED
の 3 つの値を受け取ります。ALGORITHM
句が存在しない場合、デフォルトのアルゴリズムは UNDEFINED
です。
MERGE
の場合、ビューを参照するステートメントのテキストとビュー定義がマージされ、ビュー定義の部分が対応するステートメントの部分と置き換えられます。
TEMPTABLE
の場合、ビューの結果が一時テーブル内に取得され、その後、ステートメントを実行するために使用されます。
UNDEFINED
の場合、MySQL は使用するアルゴリズムを選択します。できるかぎり TEMPTABLE
より MERGE
が優先されます。これは通常、MERGE
のほうが効率性が高く、一時テーブルを使用するとビューを更新できなくなるためです。
明示的に 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
アルゴリズムを使用できない場合、一時テーブルを代わりに使用する必要があります。ビューに次のいずれかの構造構文が含まれる場合、MERGE
は使用できません。
集計関数 (
SUM()
、MIN()
、MAX()
、COUNT()
など)DISTINCT
GROUP BY
HAVING
LIMIT
UNION
またはUNION ALL
選択リスト内のサブクエリー
リテラル値だけの参照 (この場合、ベースとなるテーブルがありません)