MySQL ビューの原則分析

MySQL ビューの原則分析

ビューは MySQL 5.0 以降で導入されました。ビューは、実際にはデータ自体を格納しない仮想データ テーブルです。この仮想テーブルのデータは、実際にはビューにアクセスする SQL クエリの結果から取得されます。 MySQL はテーブルを処理するのと同様の方法でビューを処理し、このアプローチを使用して多くのニーズを満たすことができます。 MySQL ではビューとテーブルは同じ名前空間を共有しますが、MySQL ではそれらを異なる方法で処理します。たとえば、ビューにはトリガーがなく、DROP TABLE を使用してビューを削除することはできません。

以下では、ビューの動作メカニズムを説明するために、ワールド サンプル データベースを例として使用します。

ビューの作成 オセアニア AS
	Country から * を選択、Continent が 'Oceania' の場合
  チェックオプション付き;

ビューを実装する最も簡単な方法は、SELECT クエリを実行し、その結果を一時テーブルに格納することです。その後は、ビューが表示される場所であればどこでもこの一時テーブルを参照できます。たとえば、次のクエリ:

SELECT Code, Name FROM Oceania WHERE Name = 'Australia';

以下は、上記のステートメントを実行するサーバーの可能な形式です (一時テーブル名は任意であり、実際の内部コンテンツは不明です)。

一時テーブルTMP_Oceania_123 ASを作成します 
	SELECT * FROM Country WHERE Con​​tinent = 'オセアニア';
SELECT Code, Name FROM TMP_Oceania_123 WHERE NAME = 'Australia';

この形式には明らかにパフォーマンスの問題があります。最善の方法は、次に示すように、ビューとクエリの分散クエリを 1 つの SQL ステートメントに変更することです。

国からコード、名前を選択
大陸 = 'オセアニア'、名前 = 'オーストラリア';

MySQL では、MERGE と TEMTABLE という 2 つのアルゴリズムが使用され、可能な限り MERGE アルゴリズムが使用されます。 MySQL ではネストされたビューをマージすることもできます。次の図は、2 つのアルゴリズムの違いを示しています。

MySQL は、ビューに GROUP BY、DISTINCT、集計関数、UNION、サブクエリ、または 1 対 1 の関係を持たないその他のテーブルがある場合に TEMPTABLE アルゴリズムを使用します。ビューが MERGE または TEMPTABLE を使用しているかどうかを知りたい場合は、EXPLAIN コマンドを使用して確認できます。

EXPLAIN SELECT * FROM <ビュー名>;

select_type に DERIVED がある場合は、TEMPTABLE アルゴリズムが使用されていることを意味します。したがって、非表示の派生テーブルの生成にコストがかかる場合、派生テーブルを実際に実行して構築する必要があるため、EXPLAIN は非常に非効率になり、実行速度が遅くなります。このアルゴリズムはビューのプロパティであり、クエリ タイプの影響を受けません。たとえば、ビューの作成時にアルゴリズムが指定されている場合、最適化の余地があっても、このビューに対する後続のクエリではアルゴリズムは変更されません。

CREATE ALGORITHM=TEMPTABLE VIEW v1 AS
Country から * を選択;

更新可能なビュー

更新可能なビューは、ビューによって隠されている基になるテーブルを更新できます。指定された条件が満たされている限り、通常のテーブルを操作するのと同じように、UPDATE、DELETE、さらには INSERT 操作を使用できます。たとえば、次の操作は有効です。

オセアニアを更新 SET Population = Population * 1.1 WHERE NAME = 'Australia';

ビューに GROUP BY、UNION、集計関数、またはその他の概念が含まれている場合、ビューは更新できません。 TEMPTABLE アルゴリズムを使用するすべてのビューは更新できません。

CHECK OPTION 句は、ビューを通じて変更されたデータ行が、変更後もビューの WHERE 条件と一致し続けることを確認するために使用されます。たとえば、上記の例では、異なる大陸値を持つ行が挿入されると、サーバーはエラーを報告します。

ビューのパフォーマンス

多くの人は、パフォーマンスを向上させるためにビューを使用することを考えませんが、場合によってはそれが可能です。さらに、ビューは他の領域のパフォーマンスを向上させるためにも使用できます。たとえば、テーブル構造が再構築された場合、変更されたデータ テーブルのビューを変更せずに使用できます。列権限を作成するオーバーヘッドを追加せずに、ビューを使用してフィールド権限制御を実装することもできます。

VIEW public.employeeinfo AS を作成します
	SELECT firstname, lastname --ID 番号を除く FROM private.employeeinfo;
public_user に public.* の SELECT 権限を付与します。

TEMPTABLE アルゴリズムを使用するビューのパフォーマンスは非常に低くなる可能性があります (ただし、同等の SQL クエリよりも優れている可能性があります)。このビューには最適化の余地があまりありません。

ビューは実際には非常に複雑であるにもかかわらず、開発者を騙してシンプルだと思わせる可能性があります。開発者がビューの複雑さを理解していない場合、ビューと通常のテーブルクエリの違いに気付かないでしょう。 EXPLAIN コマンドを使用すると、数百行の分析結果が出力されることがあります。これは、データ テーブルのように見えるクエリが実際にはビューであり、そのビューが他のデータ テーブルや他のビューを参照する可能性があるためです。

ビューを使用してパフォーマンスを向上させるには、慎重な分析とテストが必要です。 MERGE アルゴリズムを使用したビューでも余分なオーバーヘッドが追加される可能性があり、パフォーマンスへの影響を予測することは困難です。ビューは実際には MySQL の別の最適化アプローチを使用します。同時実行性の高いシナリオでは、ビューによってクエリ オプティマイザーが計画と統計に多くの時間を費やすようになり、サーバー側の遅延が発生することもあります。このとき、ビューを置き換えるには通常の SQL を使用する必要があります。

ビューの制限

MySQL は、他のデータベース サーバーのように物理ビューをサポートしていません (物理ビューは、非表示のテーブルに結果を生成して保存し、ソース データからビューを更新するために定期的に更新されるビューです)。 MySQL はビューのインデックスもサポートしていません。 MySQL はビューの元の SQL も保持しません。SHOW CREATE VIEW コマンドを実行してビューを編集し、返される結果の SQL を変更すると、結果が非​​常に奇妙であることがわかります。クエリ SQL は仕様に従って展開され、書式設定、コメント、インデントのない内部形式でラップされます。

以上はMySQLビュー(View)の原理の詳細な分析です。MySQLビュー(View)の原理の詳細については、123WORDPRESS.COMの他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • MySQLにおけるビューの作成(CREATE VIEW)と使用制限の詳しい説明
  • MySQLでビューを作成する方法
  • MySQL ビューの原理と使用法の詳細な分析
  • MySQLのビューとインデックスの使い方と違いの詳細な説明
  • MySql ビュー、トリガー、ストアド プロシージャに関する簡単な説明
  • MySql ビュー トリガー ストアド プロシージャの詳細な説明
  • MySQLビューの原理と使用法の詳細な説明
  • MySQL ビュー管理ビューの例の詳細説明 [追加、削除、変更、クエリ操作]
  • MySQLで更新可能なビューを作成する方法の詳細な説明
  • MySQL における単一テーブルと複数テーブル、およびビューと一時テーブルに対する Update と Select の違い
  • mysql 3つのテーブルを接続してビューを作成する

<<:  体験をデザインする: ボタンには何があるか

>>:  ズームインとズームアウトの閉じるボタンを実現する CSS (サンプル コード)

推薦する

MySQL 8.0.15 winx64 のインストールと設定方法のグラフィックチュートリアル (Windows の場合)

この記事では、MySQL 8.0.15 winx64のインストールと設定方法を参考までに紹介します。...

中央のテキストの両側に水平線を描くためのCSS

1. vertical-align プロパティは次の効果を実現します。 vertical-alig...

JavaScript ではおそらく switch 文を使う必要はない

目次スイッチも複雑なコードブロックもありませんPythonからのインスピレーション辞書を使用してスイ...

Mysql 日付クエリの詳細な紹介

現在の日付を照会する CURRENT_DATE() を選択します。 CURDATE() を選択する;...

固定、流動的、柔軟なウェブページレイアウトの長所と短所の分析

ウェブデザイナーを長い間悩ませてきた疑問があります。それは、固定レイアウト、流動的レイアウト、柔軟レ...

MySql SQL最適化のヒントの共有

ある日、内部結合を含む SQL ステートメントの実行速度はそれほど遅くはない (0.1 ~ 0.2)...

MySQLの起動と接続方法の例分析

目次mysqldの起動方法方法 1: mysqld方法 2: mysqld_safe方法3: mys...

初心者がHTMLタグを学ぶ(1)

初心者は、いくつかの HTML タグを理解することで HTML を学習できます。この入門書は、初心者...

vue3のテレポート瞬間移動機能の使い方を詳しく解説

vue3テレポート瞬間移動機能の使用は参考用です。具体的な内容は次のとおりです。テレポートは通常、瞬...

MySQLの主キーと外部キーの使用と説明を簡単に説明します

目次1. 外部キー制約外部キーとは何ですか?外部キーを使用する条件:外部キーの定義構文は次のとおりで...

JavaScript の実行コンテキストとコールスタックの詳細な説明

目次1. 実行コンテキストとは何か2. 実行コンテキスト スタックとは何ですか? 3. 実行コンテキ...

aタグ内のテキストを非表示にして画像を表示するには?360モードレンダリングに対応

多くの場合、画像を表示する<a>タグのスタイルに遭遇しますが、タグ内にテキストがあり、そ...

Tomcat を設定して IntelliJ IDEA 2018 で最初の Java Web プロジェクトを実行する方法

1 Tomcatをダウンロードして起動する公式サイト http://tomcat.apache.or...

レスポンシブWebデザイン学習(1) - 画面サイズと使用率の決定

最近では、モバイルデバイスがますます普及しており、ユーザーがスマートフォンやタブレットを使用して W...

vue-video-player を使用してライブ放送を実現する方法

目次1. vue-video-playerをインストールする2. vue-video-playerを...