QA@IT

DBのインデックスはどのような方針で貼るべきでしょうか?

12646 PV

現在は基本的に下記のような方針でインデックスを貼っています。

  • インデックスを作成したほうがよい場合

    • 大規模な表のある特定の行を頻繁に検索する
    • 列の値が(ほぼ)一意的である
    • WHERE句の条件として頻繁に使用する列である
  • インデックスを作成しないほうがよい場合

    • 列内の値の種類が少ない(性別など)
    • NULL値が多く、NULLでない値を検索しない
    • 表が小規模である

上記の他に検討すべき観点やインデックスを貼るべきケースなどあれば教えて頂ければと思います。
PostgreSQLやMySQL固有の観点や考慮すべき点などでも構いません。

回答

他、インデックスを張ることを考慮した方がいい個所として、以下はどうでしょうか。

・FK(外部キー、参照整合性制約)となるカラム
・JOIN(結合)でよくつかわれるカラム

前者は後者に含まれていますけれど。
FKを設定すると、PKなどと同じように自動でインデックスを張るRDBMSもありますね。
実装の都合でFKを物理的に設定しないことはあるかと思いますが、論理的には存在すると思います。

ただしすでに挙げられているインデックス候補と違い、こちらはまるで効果がないこともあります。
効果があるかどうかはRDBMSの種類と選択される実行計画によるので、インデックスの選択は実行計画を確認しながら試していく必要がありますね。
OracleやMS SQLなどの商用RDBMSは推奨インデックスを自動で提示してくれるので、ちょっとだけ楽をすることができます。

編集 履歴 (0)
  • やはり最終的には実行計画を確認しながら効果を測定してチューニングしていくしか無いですよね。ありがとうございます。参考になります。 -

他にも次のようなケースが挙げられると思います。

  • ORDER BY 句で頻繁に使用するフィールド(特に LIMIT 付きの ORDER BY)
  • GROUP BY 句で頻繁に使用するフィールド
  • Covering Index で高速化できそうな場合
編集 履歴 (0)
  • なるほど。ありがとうございます。 -
ウォッチ

この質問への回答やコメントをメールでお知らせします。