ビューの定義で参照できるテーブルの最大数は 61 です。
ビューの処理は最適化されていません。
ビューにはインデックスを作成できません。
マージアルゴリズムを使用して処理されたビューに、インデックスを使用することは可能です。 ただし、TEMPTABLE アルゴリズムで処理されたビューは、そのベースとなるテーブルのインデックスを利用できません (ただし、一時テーブルの作成中にはインデックスを使用できます)。
一般的な原則では、テーブルを変更することも、サブクエリーの同じテーブルから選択することもできません。 セクション13.2.11.12「サブクエリーの制約」を参照してください。
テーブルから選択するビューを選ぶ場合、ビューがサブクエリーのテーブルから選択される場合や、ビューがマージアルゴリズムを使用して評価される場合にも、同じ原則が適用されます。 例:
CREATE VIEW v1 AS
SELECT * FROM t2 WHERE EXISTS (SELECT 1 FROM t1 WHERE t1.a = t2.a);
UPDATE t1, v2 SET t1.a = 1 WHERE t1.b = v2.b;
一時テーブルを使用してビューが評価される場合、ビューサブクエリーのテーブルから選択し、さらに外部クエリーでそのテーブルを変更することが可能です。 この場合、ビューは一時テーブルに格納されるため、サブクエリーのテーブルから選択して同時に変更することはありません。 (これは、ビュー定義で ALGORITHM = TEMPTABLE
を指定することによって、MySQL で TEMPTABLE アルゴリズムを強制的に使用させる 1 つの理由です。)
DROP TABLE
または ALTER TABLE
を使用すると、ビュー定義で使用されているテーブルを削除または変更できます。 ビューを無効化する場合でも、DROP
または ALTER
操作によって警告が発せられることはありません。 代わりに、あとからビューを使用するときにエラーが発生します。 CHECK TABLE
は、DROP
または ALTER
操作で無効化されたビューのチェックに使用できます。
ビューの更新可能性に関しては、どのビューでも理論的に更新可能であれば、実際に更新可能である必要があるというのがビューの全体的な目的です。 MySQL はできるだけ迅速に実行できます。 理論的には多くの更新可能なビューを更新できるようになりましたが、まだ制限があります。 詳細は、セクション25.5.3「更新可能および挿入可能なビュー」を参照してください。
ビューの現在の実装には欠点があります。 ビューの作成に必要な基本権限 (CREATE VIEW
および SELECT
権限) がユーザーに付与されている場合、そのユーザーに SHOW VIEW
権限も付与されていないかぎり、そのユーザーはそのオブジェクトに対して SHOW CREATE VIEW
をコールできません。
権限の不足のために mysqldump が失敗する可能性があるという欠点によって、このコマンドを使用したデータベースのバックアップで問題が発生する場合があります。 この問題については Bug #22062 で説明しています。
問題の回避策として、ビューが作成されたときに MySQL が暗黙的に SHOW VIEW
権限を与えないため、CREATE VIEW
を認められているユーザーに、管理者が手動でこの権限を付与します。
ビューにはインデックスがないので、インデックスのヒントは適用されません。 ビューからの選択時のインデックスヒントの使用は許可されていません。
SHOW CREATE VIEW
は、カラムごとに AS
句を使用してビュー定義を表示します。 式からカラムを作成する場合、デフォルトのエイリアスは式テキストになり、かなり長くなることがあります。 alias_name
CREATE VIEW
ステートメント内のカラム名に対するエイリアスは、(256 文字の最大のエイリアス長ではなく) 64 文字の最大のカラム長に対してチェックされます。 その結果、いずれかのカラムエイリアスが 64 文字を超えた場合、SHOW CREATE VIEW
の出力から作成されたビューは失敗します。 これによって、長すぎるエイリアスを持つビューに対し、次の環境で問題が起きる可能性があります。
ビュー定義は、カラム長制限を強制する新しいレプリカへのレプリケートに失敗します。
mysqldump で作成されたダンプファイルは、カラム長の制約を強制するサーバーにロードできません。
これらの問題を回避するには、短いカラム名を提供するエイリアスを使用するように、問題のある各ビュー定義を変更します。 その後、ビューは適切にレプリケートされ、エラーを発生させずにダンプおよびリロードできます。 定義を変更するには、DROP VIEW
および CREATE VIEW
でビューを削除してから再度作成するか、CREATE OR REPLACE VIEW
を使用して定義を置き換えます。
ダンプファイルのビュー定義リロード時に問題が発生する場合は、CREATE VIEW
ステートメントを変更するようにダンプファイルを編集するとこの問題を回避できます。 ただし、これは元のビュー定義を変更しないので、その後のダンプ操作の問題を引き起こす可能性があります。