インデックス戦略に関するガイダンスはどこで入手できますか?


22

私たちのほとんどは、おそらくデータベースインデックスを使用するのが良いことに同意するでしょう。インデックスが多すぎると、パフォーマンスが実際に低下する可能性があります。

原則として、どのフィールドにインデックスを付ける必要がありますか?
どのフィールドにインデックスを付けるべきではありませんか?
パフォーマンスの向上ではなく、パフォーマンスの向上を達成するために、インデックスの数が多すぎて十分ではないというバランスを取りながら、インデックスを使用するためのルールは何ですか?


7
インデックス作成のガイダンスについては、use-the-index-luke.com
Mike Sherrill 'Cat Recall'

回答:


24

ショート

「インデックスが多すぎる」というルールは、誤解を招く可能性があります。

長いです

平均的なデータベースの約98%の読み取り(またはそれ以上)を考慮すると、読み取りを最適化する必要があります。たとえば、一意のインデックスがある場合、INSERTは読み取りです。または、更新のWHERE。私はかつて、書き込み集中型のデータベースでさえ、85%の読み取りであることを読みました。

あなたが持っているのは質の悪い索引付けです。例:

  • 広いクラスター化インデックス(特にSQL Server)
  • 非単調なクラスター化インデックス
  • 重複したインデックス(例えばcold, colecold, cole, colf)
  • クエリには役に立たない多くの単一列インデックス(より有用なインデックスとも重複)
  • INCLUDEなし、カバーなし(すべての単一列インデックスなど)
  • ...

OLTPシステムであっても、実際のデータの数倍のインデックスを持つことは非常に一般的です。

一般的に、私は

  • クラスター化インデックス(通常はPK)
  • 一意のインデックス(制約ではなく、これらはカバーできません)
  • 外部キー列

それから私は見てみたい:

  • 一般的なクエリと私が必要なものを参照してください。毎秒実行されるクエリはチューニングが必要です。日曜日の午前4時のレポートは待機できます。
  • SQL Serverの場合、加重欠落インデックスDMV

それを言って、システムを調整するために物事がどのようにパンアウトしたかを見て(100億行後)、いくつかのシステムについてこれらの規則を破りました。しかし、なぜそうするのかを実証できなければ、インデックスを作成しないとは考えません


2
どこからそれらの数字を入手しましたか?98%は、特に「ビッグデータ」の時代に非常に高いようです(別名すべてを保存し、いつか役に立つことを願っています)
rm

7

データベースの使用状況と負荷をプロファイリングし、インデックスの欠落またはインデックスが多すぎるためのボトルネックを特定する必要があります。次に、適切なインデックスを選択する必要があります。これには、特定のデータベースインデックス作成技術に関する十分な知識が必要です。


7

どのインデックスを選択するか、そしてなぜGail Shawが執筆するかについて書かれた最高の記事シリーズの1つです。こちらをクリックして記事を見つけることができます

あなたが尋ねる質問には、50の異なる方法で答えることができます。それは本当にあなたが持っているデータとそれがどのようにクエリされるかということです。一般的なルールは、ヒープを回避するために、各テーブルにクラスター化インデックスを常に用意することです。通常、クラスタ化インデックスはできるだけ小さくする必要があります。テーブルにクラスター化インデックスがある場合、非クラスター化インデックスのリーフページにあるすべてのインデックスレコードは、ブックマーク検索用の各クラスター化インデックスのレコード値を格納します。テーブルがヒープの場合、SQLはブックマーク検索用の一意の識別子を作成します。8バイトまたは16バイトのサイズを思い出せません。これは、INTと言うよりもはるかに大きなデータ型になる可能性があります。ヒープテーブルに8つの非クラスター化インデックスがあることを想像してください。


読者への注意:MS SQLの「ブックマーク検索」は、Oracleの「ACCESS BY ROWID」と同等です。参照してください stackoverflow.com/a/820731/122727
kubanczyk

5

ここで、データベースごとに異なる戦略が必要であることを付け加えます。たとえば、MySQL w / InnoDBとPostgreSQLを比較してみましょう。

InnoDB

InnoDBテーブルは基本的に、インデックスエントリに行情報を含めるように拡張された主キーのBツリーインデックスです。物理的な順序のスキャンはサポートされておらず、すべてのスキャンは論理的な順序で行われます。これは2つのことを意味します。

  1. Innodbでの順次スキャンは、大量のランダムディスクI / Oを生成し、

  2. 主キーインデックスは、セカンダリインデックスを使用しているかどうかに関係なく走査する必要があります。

  3. このモデルでは、他のアプローチよりも主キーの検索が高速です。

この場合、複数ページのテーブルに十分なフィールドのインデックスを作成することが非常に重要です。典型的なルールは、フィルタリングするすべてのものにインデックスを付けることです。

PostgreSQL

PostgreSQLは、ファイルごとに1つのテーブル(一部のテーブルは多数のファイル)のヒープファイルを使用します。ここでは、そのヒープの空き領域からタプルが割り当てられます。物理的な注文スキャンがサポートされています。論理順序スキャンを機能させるには、インデックスを追加する必要があります。

PostgreSQLの主キーは、基本的に値がNULLにならない一意のインデックスのサブセットです。UNIQUE制約は暗黙的なインデックスを使用して行われ、他のいくつかのインデックスタイプはインデックスで可能なさまざまな操作でサポートされます。

これの意味は:

  1. インデックスファイルテーブルファイルにヒットする合理的に大きなテーブルを前提とするプライマリキールックアップ。これは、インデックスのみをたどる必要があり、行がインデックスに含まれるMySQLのアプローチよりも大幅に遅くなります。

  2. 物理的な順序スキャンのパフォーマンスが大幅に向上し、かなりの数の行が処理されるランダムなディスクI / Oが減少します。

  3. セカンダリインデックススキャンは、テーブルの物理的な部分に到達するためにたった1つのインデックスをたどる必要があるため、MySQLのスキャンよりもパフォーマンスが高くなります。

このモデルでは、インデックスが必要になることがよくありますが、プランナはインデックスを使用する自由度が高く、インデックスを使用しない場合の影響はそれほど深刻ではありません。テーブルは(pkeyルックアップに特化するのではなく)より一般的に最適化されているため、必要なインデックスは少なくなります。

TL; DR

あなたのRDBMSを知っています。



2

上記のすべてのリンクを使用しても、インデックスのケア、フィード、および使用に関してKimberly Trippが書いた内容を確認する必要があります。

まず、このリンクからKimberlyのインデックス関連のブログ投稿のコレクションをご覧ください。ブラウザウィンドウの左側にある[このページ上]および[カテゴリ]ウィジェットを使用して、特定のトピックを探索できます。

ここには多くの情報がありますが、それで気を悪くしないでください。

キンバリーのアバウトページはこちら


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.