MySQLでビューを使用する場合


54

分析で使用するために複数の結合からテーブルを作成する場合、新しいテーブルを作成するよりもビューを使用する方が適切ですか?

ビューを使用したい理由の1つは、データベーススキーマが管理者によってRuby内から開発されており、Rubyに詳しくないことです。テーブルの作成をリクエストできますが、追加の手順が必要であり、新しい結合を開発/テストする際の柔軟性を高めたいです。

SO(Rを使用する場合、SQLを使用する場合)に関連する質問への回答に従ってビューを使用し始めました。トップ投票の答えは、「データが単一のテーブルに収まるまでSQLでデータ操作を行い、残りをRで行う」ことから始まります。

ビューの使用を開始しましたが、ビューに関するいくつかの問題に遭遇しました。

  1. クエリははるかに遅い
  2. ビューは、分析に使用する実稼働データベースからバックアップデータベースにダンプされません。

ビューはこの用途に適していますか?もしそうなら、パフォーマンスのペナルティを期待すべきですか?ビューのクエリを高速化する方法はありますか?


ここではビューが適切であるように思えますが、クエリを実行するときに速度低下の原因が何であるかはわかりません。
FrustratedWithFormsDesigner

@FrustratedWithFormsDesigner(再現可能な例を作成する以外に)役立つ診断はありますか?同じ複雑なクエリは、結合されたテーブルで直接実行されると4秒未満、ビューで実行されると25秒以上かかります。ビューにはパフォーマンスのペナルティがないと予想されますか?
デビッドルバウアー

MySQLを使用してから長い時間が経ちましたので、本当に言えません。
FrustratedWithFormsDesigner

私は、MySQLを使用して、私はあなたが100Kを取得し、上記の、ちょうどあなたが返すようにフィールド何のコントロールを持っているし、何を使用するために加入ストレートクエリを使用するときにビューが使用不能、ひどいです教えてくれる
スティーブンSenkomago Musoke

回答:


43

MySQLのビューは、2つの異なるアルゴリズムのいずれかを使用して処理されます:MERGEまたはTEMPTABLEMERGE適切なエイリアスを使用した単純なクエリ拡張です。TEMPTABLEはまさにそのように聞こえます。ビューは、WHERE句を実行する前に結果を一時テーブルに入れますが、インデックスはありません。

「3番目」のオプションはUNDEFINED、適切なアルゴリズムを選択するようMySQLに指示します。MySQL MERGEはより効率的であるため、使用を試みます。主な注意事項:

MERGEアルゴリズムを使用できない場合は、代わりに一時テーブルを使用する必要があります。ビューに次の構造のいずれかが含まれている場合、MERGEは使用できません。

  • 集計関数(SUM()、MIN()、MAX()、COUNT()など)

  • 区別する

  • GROUP BY

  • 持っている

  • 限定

  • UNIONまたはUNION ALL

  • 選択リスト内のサブクエリ

  • リテラル値のみを参照します(この場合、基礎となるテーブルはありません)

[ソース]

VIEWSがTEMPTABLEアルゴリズムを必要としているため、パフォーマンスの問題が発生していると思います。

ここで本当に古いブログ記事のMySQL内のビューのパフォーマンスに、よくなってきていないようです。

ただし、トンネルの終わりに、インデックスを含まない一時テーブルの問題(テーブル全体のスキャンが発生する)について多少の光があるかもしれません。で5.6

FROM句のサブクエリにマテリアライズが必要な場合、オプティマイザは、マテリアライズされたテーブルにインデックスを追加することにより、結果へのアクセスを高速化できます。...インデックスを追加した後、オプティマイザは、マテリアライズされた派生テーブルをインデックス付きの通常のテーブルと同じように扱うことができ、生成されたインデックスから同様に恩恵を受けます。インデックス作成のオーバーヘッドは、インデックスなしのクエリ実行のコストと比較して無視できます。

@ypercubeが指摘するように、MariaDB 5.3は同じ最適化を追加しました。この記事には、プロセスの興味深い概要が記載されています。

最適化が適用されると、派生テーブルを親SELECTにマージできませんでした。これは、派生テーブルがマージ可能なVIEWの基準を満たしていない場合に発生します


私はこれらの主張には何のテストが行われていないが、MariaDB 5.3は、(最近安定したとしてリリース)いくつかの主要なていビューを含む、オプティマイザの改善、Fields of merge-able views and derived tables are involved now in all optimizations employing equalities
ypercubeᵀᴹ

@ypercubeそのリンクに感謝します... MySQL 5.6には、少なくとも派生テーブルにインデックスを追加する最適化があるようです。
デレクダウニー

14

ビューはセキュリティツールです。特定のユーザーまたはアプリケーションにデータテーブルの場所を知らせたくない場合は、必要な列のみを含むビューを提供します。

ビューは常にパフォーマンスを低下させるので、同様のクエリはビューではなくストアドプロシージャと関数である必要があります。

クエリチューニングを行うには、常にベストプラクティスに従い、WHERE句で関数を使用することを避け、選択を高速化するためにインデックスを作成します。ただし、インデックスを悪用しないでください。

あなたを助けることができる良いドキュメントがあります:http : //www.toadworld.com/LinkClick.aspx?fileticket=3qbwCnzY/0A=&tabid=234


5
ビューが(唯一の)セキュリティツールであることに同意しません。それらはそのように使用できますが、レポート開発者が定期的に使用するクエリの複雑さを取り除くために使用します。
-JHFB

2
@JHFB:私はあなたに同意しますが、多分それはビューが深刻なパフォーマンスのペナルティを負うように聞こえるMySQLでそれがどのように機能するのでしょうか?
FrustratedWithFormsDesigner

@frustratedwithformsdesignerのすばらしい点-MySQLを使用してからしばらく経ちました。
-JHFB

1
Mysqlの@JHFBビューは大きな問題です!mysqlperformanceblog.com/2007/08/12/…–
Rainier

2
@RainierMorillaビューはパフォーマンスを低下させます!! ??
スハイルグプタ

-2

ビューは、複数のテーブルクエリから克服するためにテーブルを1つにマージするための事前定義された構造(データなし)であり、実際のデータから使用して迅速なリレーショナルクエリを実現できると思います...


2
どのポイントを作成しようとしているのか、それが元の投稿で説明した問題にどのように対処しているのかは明確ではありません。質問を読み直すこともできますが、いずれにせよ、OPの問題にどのように適用できるかを明確にするために、回答を拡大することを検討してください。
アンドリーM
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.