アマチュア向けのデータベース最適化手法
-
01-10-2019 - |
質問
基本的な最適化手法のリストを取得できますか(モデリングからクエリ、インデックスの作成、最適化までのビューの作成まで)。これらのリストがあると、答えごとに1つのテクニックがあるといいでしょう。愛好家として、私はこれが非常に便利であると思うでしょう、ありがとう。
あいまいすぎないために、MySQLやOracleなどのメンテアストリームDBを使用しているとし、DBには10テーブルに500,000〜1M程度のレコードが含まれているとしましょう。最も典型的なストレージエンジン(例:mysqlのInnodb)。そしてもちろん、PKSなどの基本はFK Contraintと同様に定義されています。
解決
インデックスについて学び、それらを適切に使用します。 一般的に言えば、次のガイドラインに従ってください。
- すべてのテーブルには、クラスター化されたインデックスが必要です
- フィルターやソートに使用されるフィールドは、インデックス作成に適した候補です
- もっと 選択的 フィールドは、インデックス作成のより良い候補です
- 重要なクエリで最高のパフォーマンスを得るには、それらのクエリの「インデックスをカバーする」デザイン
- インデックスが実際に使用されていることを確認し、そうでないインデックスを削除してください
- テーブルに15のフィールドがあり、それぞれが単一のフィールドしかない15のインデックスを作成する場合、あなたはそれを間違っています:)
*あなたが何をしているのか知っているなら、これらのルールにはいくつかの例外があります。私の経験はMicrosoft SQL Serverですが、このアドバイスのほとんどはまだ異なるRDMに適用されると思います。
他のヒント
IMOは、最適化された最適化は、データモデルが構築された問題ドメインに適合させることです。そうでない場合、結果として得られる症状は、希望の情報を取得するために、操作が執筆が困難または複雑なクエリであり、通常、データベースに対してレポートが作成されるとそれ自体が繰り返されます。したがって、データベースを設計する際に、ユーザーがシステムから望むレポートなどの情報の種類と性質についてアイデアを得ることができます。
いくつかのクエリ/スキーマの最適化:
別個またはグループを使用するときは注意してください。多くの新しい開発者は、Existsステートメントまたは派生クエリを使用して、実際には必要ない、またはより効率的に書き直される可能性がある場所で異なる使用を使用することがわかります。
残りの参加に注意してください。多くの場合、新しいSQL開発者は、整備されているスキーマを無視し、実際に必要ではない左の結合を使用します。例えば:
Select
From Orders
Left Join Customers
On Customers.Id = Orders.CustomerId
注文。CustomerIDが必要な列である場合、左結合を使用する必要はありません。
新機能の学生になります。現在、MySQLは一般的なテーブル式をサポートしていません。これは、CTEがサポートされている場合よりも、いくつかのタイプのクエリが面倒で、おそらくより遅いことを意味します。しかし、それは永遠に真実ではありません。 MySQLの新しい構文機能を維持し、既存のクエリをより効率的にするために使用される可能性があります。
どこでもサロゲートキーを使用する必要はありません。多くの場合、開発者が追加の結合を避けることができるインテリジェントキー(米国の州の略語、通貨コードなど)により適したテーブルがあるかもしれません。
可能であれば、OLAPまたはレポートサーバーにデータをアーカイブする方法を見つけてください。制作データを作ることができるほど、実行される速度が速くなります。
あなたの問題を簡潔にモデル化するデザインは、常に良いスタートです。データモデルを過剰に化すると、パフォーマンスの問題が発生する可能性があります。たとえば、RDBMSを馬鹿げた「名前/価値」ストアとして使用する超柔軟性を求めて努力しているプロジェクトの報告を聞いたことがあり、結果として生じるパフォーマンスは恐ろしいものでした。
優れたデザインが整ったら、RDBMSが提供するツールを使用して、優れたパフォーマンスを実現します。単一のフィールドPK(複合材料なし)ですが、一意の制約を備えたインデックスとしての複合ビジネスキー、適切なデータ型の使用、たとえば、charまたは同様ではなく数値の適切な数値タイプを使用します。ハードウェアの物理的属性RDBMSが実行されていることも考慮する必要があります。クエリ時間の大部分はしばしばディスクI/Oです - もちろんこれを当たり前のこととは思わないでください - プロファイラーを使用して、時間がどこに行くのかを調べます。
更新/クエリの比率に応じて、マテリアルビュー/インデックス付きビューは、実行クエリの遅いパフォーマンスを改善するのに役立ちます。貧しい人の代替手段は、トリガーを使用して、ゆっくりと頻繁に変化するまれな見方の結果でテーブルに入力する手順を呼び出すことです。
クエリの最適化は、データベースに依存していることが多いため、少し黒いアートですが、ここにはいくつかの経験則が与えられています - SQLの最適化.
最後に、おそらくあなたの質問の意図された範囲の外側にありますが、アプリケーションで優れたデータアクセスレイヤーを使用し、自分のものを転がす誘惑を避けてください。データアクセスレイヤー、中間層、アプリケーションレイヤーでのキャッシュの使用は、パフォーマンスを大幅に改善するのに役立ちます。
使用してください クエリが少ない いつでも可能なとき。 「結合」を使用し、テーブルをグループ化して、単一のクエリが結果を与えるようにします。
良い例は次のとおりです 変更された予約順のツリー横断 (MPTT)1回のクエリで注文したすべてのツリーノード親を取得する。
最適化のために全体的なアプローチをとってください。
スローディスク、ネットワークレイテンシ、メモリの欠如、サーバーの負荷の影響を考えてください。