0

次のような 2 つのテーブルがあるとします。

雇用者 (id、name、....、deptId)。
部門 (id、deptName、...)。

しかし、これらのデータはそれほど頻繁に変更されることはないので、このようなクエリが必要です

SELECT name, deptName FROM Employers, Depts 
    WHERE deptId = Depts.id AND Employers.id="ID"

できるだけ速く。

私の頭には、2つの可能な解決策があります。

  • テーブルを非正規化します。

    それにもかかわらず、このソリューションを使用すると、「データベースを正規化することの大きな利点のいくつかが失われますが、ここではパフォーマンスが必須です。

  • その非正規化データのビューを作成します。

    私はデータを正規化したままにし、(ここに私の質問があります)、そのビューに対するクエリのパフォーマンスは、そのビューがない場合よりも高速になります。

または、同じ質問をする別の方法として、ビューに対してクエリを実行するたびにビューが「解釈」されるか、DBA でビューがどのように機能するかという質問があります。

4

4 に答える 4

5

一般に、MS SQL Server などの一部のソフトウェアのオプションであるビューを「マテリアライズ」しない限り、ビューはベース テーブルに対するクエリに変換されるだけなので、元のテーブルよりも速くも遅くもありません (わずかな量のクエリの翻訳にかかる時間は、実際にクエリを実行することに比べれば何でもありません)。

パフォーマンスに問題があることをどうやって知ることができますか? 負荷がかかった状態でプロファイリングしていますか? パフォーマンスのボトルネックがこれら 2 つのテーブルであることを確認しましたか? 一般に、確かなデータが得られるまでは、パフォーマンスの問題の原因がどこにあるかを知っていると思い込まないでください。また、最適化が正しいことであることがわかるまでは、最適化に時間を費やさないでください。パフォーマンスの問題の 80% は 20 から発生します。コードの %。

于 2009-01-09T14:32:29.220 に答える
1

Depts.ID がそのテーブルの主キーであり、Employers.DeptID フィールドにインデックスを付ける場合、このクエリは数百万のレコードを超えても非常に高速になります。

そのシナリオでは、非正規化は意味がありません。

一般的に言えば、ビューのパフォーマンスは、クエリ自体を実行するときのパフォーマンスとほぼ同じです。ビューの利点は、単純にそのクエリを抽象化することです。そのため、それについて考える必要はありません。

マテリアライズド ビュー (または「スナップショット」と言う人もいます) を使用することもできますが、その場合、データは最後の更新と同じくらい新しくなります。

于 2009-01-09T14:42:41.943 に答える
1

返信の 1 つへのコメントで、質問の作成者は、MySQL でマテリアライズド ビューを作成する方法を探していると説明しています。

MySQL は、他の DBMS のようにマテリアライズド ビューの概念を適切なパッケージにまとめていませんが、マテリアライズド ビューを作成するために必要なすべてのツールを備えています。

あなたがする必要があるのはこれです:

  1. クエリの結果の初期マテリアライゼーションを作成します。
  2. 新しく挿入された雇用主に一致するすべての行を具体化されたテーブルに挿入する、雇用主テーブルへの挿入時にトリガーを作成します。
  3. マテリアライズド テーブルから対応する行を削除する、employers テーブルでの削除のトリガーを作成します。
  4. マテリアライズド テーブル内の対応する行を更新する、employers テーブル内の更新時のトリガーを作成します。
  5. 部門テーブルも同様です。

基礎となるテーブルが頻繁に更新されない場合、これはうまくいくかもしれません。ただし、これを行うと、作成/更新/削除操作の追加コストに注意する必要があります。また、あなたの策略を知らない DBA が、トリガーを移行せずにデータベースを移行しないようにする必要があります。したがって、それを適切に文書化してください。

于 2009-01-09T15:03:02.713 に答える
0

明確で現在の問題であることがわかっていない限り、時期尚早の最適化のように聞こえます。

MySQLはビューをマテリアライズしません。ビューは、ベーステーブルに対するクエリよりも高速ではありません。さらに、最適化が不十分なため、速度が低下する場合もあります。

しかし、ビューはまた、クエリが実際よりも複雑ではないことを想像させるために、将来コードを維持する開発者からのものを「隠し」ます。

于 2009-01-10T08:07:22.880 に答える