84

ビューを使用する道を進んでいる場合、どうすれば優れたパフォーマンスを確保できますか?

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

4

6 に答える 6

122

場合によります。

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

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

ビューの利点:

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

次の便利なリンクを参照してください。

  1. VIEW と SQL ステートメントのパフォーマンス
  2. ビューは単純なクエリよりも高速ですか?
  3. Mysql VIEWS と PHP クエリ
  4. MySql ビューは動的で効率的ですか?
  5. マテリアライズド ビューとテーブル: 利点は何ですか?
  6. ビューに対するクエリは、SQL を直接実行するより遅いですか?
  7. TEMPTABLE ビューのパフォーマンスの問題の回避策
  8. SQL Server でインデックス付きビューを使用してパフォーマンスを向上させる
于 2012-04-30T07:15:28.367 に答える
13

ここに tl;dr の要約があります。Peter Zaitsev や他の場所からの詳細な評価を見つけることができます。

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

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

于 2012-04-28T05:48:30.187 に答える
11

Peter Zaitsev のブログにほとんどの詳細があると思います。個人的な経験から言えば、ビューは一般的にシンプルに保つとうまく機能します。私のクライアントの 1 つで、あるビューを別のビューの上にレイヤー化し続け、パフォーマンスの悪夢に終わりました。

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

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

于 2012-04-27T07:56:19.740 に答える
8

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

于 2012-04-28T16:45:06.497 に答える
3

ビューのパフォーマンス効果ではなく、「ビューを使用する場合、パフォーマンスを確保する方法」について話し合う場合、それは(自分自身のように)抑制に帰着すると思います。

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

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

最後に、ビューを使用している理由を確認する必要があります。プログラミング側での作業を楽にするためにこれを行うときはいつでも、ストアドプロシージャIMHOを使用したほうがよい場合があります。

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

于 2012-04-27T08:00:44.160 に答える