web-dev-qa-db-ja.com

テーブルに作成するインデックスを知るにはどうすればよいですか?

テーブルにどのインデックスを作成するかを知る最良の方法を見つける方法はありますか?

34
Nick Ginanto

短い経験則。 (これらの一部は自動的に作成されますが、dbmsによっては、後で手動で削除できる場合があります。PostgreSQLで常に作業することを想定しないでください。 )

  • すべての主キーにインデックスを付けます。
  • すべての外部キーにインデックスを付けます。
  • JOIN句で使用されるすべての列にインデックスを付けます。
  • WHERE句で使用されるすべての列にインデックスを付けます。
  • ドキュメントを調べて、dbmsがサポートする「難解な」インデックス作成オプションを確認してください。

すべての主キーは、複数列の主キーがすべての列をカバーする単一のインデックスを持つ必要があることを意味します。複数列の主キーを宣言すると、PostgreSQLはこのインデックスを自動的に作成します。

単一のマルチカラムインデックスが複数のシングルカラムインデックスよりも優れたパフォーマンスを提供する場合が多くあります。 遅いクエリを監視する そして、どれがどれであるかを理解するためにテストを行います。

索引付けを変更すると、一部のデータベースアクティビティが改善され、他のアクティビティが低下すると想定します。インデックスに変更を加える前後にプロファイルできる一連のSQLステートメントがあると便利です。このセットには、SELECT、INSERT、UPDATE、およびDELETEステートメントが含まれます。

特定のdbmsのドキュメントを研究する代わりはありません。

  • インデックスの作成
  • Indexes (特に、インデックス式、部分インデックス、およびインデックスの使用の調査に関するセクションに注意してください)

@ Catcallはすでに提供されています に加えて、小さな修正を追加します。

この密接に関連するSO最近)の回答 の基本事項についても説明しました。

これまでの回答は、主キーにインデックスを作成する必要があることを示しているようですが、PostgreSQLではそうではありません(一部の例外が適用されます)。引用します マニュアルはこちら

PostgreSQLは、一意の制約または主キーがテーブルに定義されている場合、一意のインデックスを自動的に作成します。 インデックスは、主キーまたは一意の制約を構成する列(該当する場合は複数列のインデックス)をカバーし、制約を適用するメカニズムです。

大胆な強調鉱山。

may複数列のインデックスの2番目以降の列に追加のインデックスを作成したいが、最初の列は通常、複数列のインデックスで問題なくカバーされている-列を追加すると、インデックスが大幅に大きくなります。これについては、この関連する質問の下で詳しく説明しました。

複合インデックスは最初のフィールドのクエリにも適していますか?

マルチカラムインデックス部分インデックス および 式のインデックス は、PostgreSQLの特に強力なツールです。 PostgreSQL 9.2以降、 index-only scans もあり、他のRDBMSの「カバーするインデックス」に相当します。これは別のタイプのインデックスではなく、既存のインデックスタイプを使用したRDBMSの新機能です。

すべてのインデックスには特定のコストが含まれているため、インデックス作成を実際に最適化するための基本的な知識を回避する方法はありません。より多くのインデックスを作成することは、良いことよりも害を及ぼす可能性があります。特に、インデックスは HOT update によるパフォーマンスの向上を妨げる可能性があります。

一般的に、書き込み操作(DELETEUPDATE)はより高価になります(ただし、メリットもある可能性があります)。一方、読み取り操作(SELECT)は通常、メリットがあります。インデックスが多すぎると、キャッシュメモリが使い果たされる可能性があるため、読み取り操作canでも問題が発生します。

最後に、 このインデックスのメンテナンスに関するPostgres Wikiページ は、(特に)重複または未使用のインデックスを検索するツールを備えています。

14

2つのオプションがあります。

  1. あなたはそれを行う。
  2. テクノロジーはそれを行います。

自分で行うための答えは、ここにかなり徹底的に文書化されています。それでは、別のことを見てみましょう。

Pghero

Pghero 自動化されたアドバイスが必要な場合は、あなたを支援できる可能性があります。

それはそれがいくつかの欠点を持っていると述べた。

  1. WHEREORDER BYでのみ機能し、JOINSでは機能しません。
  2. NULLパーセントの統計と個別の値のみを使用します。

このビデオをチェックしてください 詳細について

1
Evan Carroll