web-dev-qa-db-ja.com

MySqlビューのパフォーマンス

ビューを使用する道を進んでいる場合、どのようにして良好なパフォーマンスを確保できますか?

または、そもそもビューを使用せず、選択ステートメントに同等のものを組み込む方が良いでしょうか?

64
Ed Heal

場合によります。

それは完全にあなたがビューを通して見ているものに依存します。しかし、おそらくあなたの努力を減らして、より高いパフォーマンスを与えます。 SQLステートメントがインデックスなしのビューを参照する場合、パーサーとクエリオプティマイザーはSQLステートメントとビューの両方のソースを分析し、それらを単一の実行プランに解決します。 SQLステートメント用の1つのプランとビュー用の別のプランはありません。

ビューはコンパイルされません。他のテーブルで構成された仮想テーブル。作成しても、サーバー上のどこにも存在しません。ビューを構成する基礎となるクエリは、クエリオプティマイザーと同じパフォーマンスの向上または影響を受けます。ビューとその基礎となるクエリでパフォーマンスをテストしたことはありませんが、パフォーマンスがわずかに異なる可能性があると思います。データが比較的静的な場合、インデックス付きビューのパフォーマンスが向上します。これは、おそらく「コンパイル済み」の観点から考えていることかもしれません。

ビューの利点:

  1. データをオブジェクトに保存せずにデータを表示します。
  2. テーブルのビューを制限します。つまり、テーブルの列の一部を非表示にすることができます。
  3. 2つ以上のテーブルを結合し、ユーザーに1つのオブジェクトとして表示します。
  4. 誰もテーブルに行を挿入できないように、テーブルのアクセスを制限します。

次の便利なリンクをご覧ください。

  1. VIEW対SQLステートメントのパフォーマンス
  2. ビューは単純なクエリよりも高速ですか?
  3. Mysql VIEWS vs. PHP query
  4. MySqlビューは動的かつ効率的ですか?
  5. マテリアライズドビューとテーブル:利点は何ですか?
  6. SQLを直接実行するよりもビューに対するクエリは遅いですか?
  7. TEMPTABLEビューのパフォーマンスの問題の回避策
  8. SQL Serverのインデックス付きビューを使用してパフォーマンスの向上を確認
92
Somnath Muluk

Peter Zaitsevのブログには、ほとんどの詳細が含まれていると思います。個人的な体験の観点から言えば、一般的にシンプルにすればうまくいく可能性があります。私のクライアントの1人では、1つのビューを別のビューの上に重ね続けていたため、パフォーマンスの悪夢に陥りました。

通常、ビューを使用して、テーブルの異なる側面を表示します。たとえば、私の従業員テーブルでは、マネージャーを表示したり、人事以外の従業員の給与フィールドを非表示にしたりします。また、クエリとビューでEXPLAINを実行して、MySQL内で何が起こっているかを正確に理解するようにしてください。

シナリオで確実な証明が必要な場合は、テストすることをお勧めします。ビューを使用することが常にパフォーマンスのキラーであると言うのは非常に困難です。また、不適切に記述されたビューがパフォーマンスを低下させる可能性があります。

8
Namphibian

彼らは目的を果たしますが、隠された複雑さと非効率性は通常、より直接的なアプローチを上回ります。私はかつて2つのビューで結合し、結果を並べ替えるSQLステートメントに遭遇しました。ビューもソートされていたため、実行時間は数時間と思われるもので測定できました。

7
GDP

ここにtl; drの要約があります。PeterZaitsevなどから詳細な評価を見つけることができます。

MySQLのビューは一般的に悪い考えです。 Groovesharkでは、それらを有害と見なし、常に回避しています。注意すれば、それらを機能させることができますが、せいぜいデータを選択する方法を覚えておくか、複雑な結合を再入力する必要がないようにする方法です。最悪の場合、非常に非効率的になり、複雑さを隠し、誤ってネストされた副選択(一時テーブルを必要とし、ディスクスラッシングを引き起こす)などを引き起こす可能性があります。

それらを回避し、クエリをコードに保持することをお勧めします。

7
Jay Paroline

これまで言及されていませんが、大きな違いをもたらすのは、ビューの適切なインデックス付け 'sourceテーブルです。

上記のように、ビューはDBに存在しませんですが、毎回再構築です。したがって、DBの再構築を容易にするすべての機能により、ビューのパフォーマンスが向上します。

多くの場合、ビューはストレージに非常に悪い(通常の形式ではない)方法でデータを結合しますが、さらなる使用(分析の実行、ユーザーへのデータの提示など)には非常に適しています。

操作が行われる列にインデックスが付けられているかどうかによって、ビューのパフォーマンスに大きな違いが生じます。 テーブルとその関連列がすでにインデックス付けされている場合、ビューにアクセスしても、最初にインデックスを何度も何度も再計算することはありません。 (欠点は、ソーステーブルでデータが操作されるときに行われます)

!CREATE VIEWステートメントのJOINSおよびGROUP BY句で使用されるすべての列にインデックスを付けます!

3
petermeissner

「ビューを使用する場合、パフォーマンスを確保する方法」ではなく、一般的なビューのパフォーマンス効果について議論している場合、それは(あなた自身のように)抑制に要約されると思います。

すべての場合においてクエリを単純にするためにビューを作成するだけでは大きな問題に直面する可能性がありますが、実際にはビューがパフォーマンス面で有用であることを気にしないでください。最後に実行しているクエリはすべて正常に実行されている必要があります(@eggyalによるリンクのコメント例を参照)。もちろんそれはトートロジーですが、それゆえにそれほど価値はありません

ビューからビューを作成するのが簡単になるという理由だけで、ビューからビューを作成しないように特に注意する必要があります。

最後に、ビューを使用している理由を調べる必要があります。プログラミングの終わりに人生を楽にするためにこれを行うときはいつでも、ストアドプロシージャIMHOの方が良いかもしれません。

物事を管理するために、特定のビューを持っている理由を書き留めて、それを使用する理由を決定することができます。プログラミング内での「新しい」使用のたびに、実際にビューが必要かどうか、なぜそれが必要なのか、そしてこれがまだ正しい実行パスを提供するかどうかを再確認してください。用途を常にチェックして、スピーディに保ち、そのビューが本当に必要かどうかをチェックし続けます。

3
Nanne