一般的に言えば:
1。実際に必要な場合を除いて、インデックスを追加しないでください。
インデックスごとに書き込みが遅くなります...
2。 where句にはインデックスが使用されます:
-- index on foo (bar)
select bar from foo where bar = :bar;
同じトークンで、(両方のテーブルの)外部キー参照で使用されます。
-- index on foo (bar) if baz (bar) is frequently updated/deleted.
create table foo (bar references baz (bar));
3。インデックスは、特に制限に関連付けられている場合に、並べ替えに使用されます:
-- index on foo (bar)
select bar from foo order by bar limit 10;
4。複数列のインデックスは、2。と3.の両方が適用される場合に役立つことがあります。
この場合、where条件を最初に置き、ソートキーを最後に置きます:
-- index on foo (baz, bar)
select bar from foo where baz between :baz1 and :baz2 group by bar;
5。テーブルの統計を最新の状態に保ちます。
テーブルの統計がガベージである場合、オプティマイザがインデックスを使用する可能性はほとんどありません。必要に応じて、データベースを手動でバキューム/分析します。
6。インデックスの使用法は、テーブルの再パーティションによって異なります。
取得された行の特定のしきい値を超えると、全表スキャンを実行する方が高速になります。インデックスがブールフィールド上にあり、テーブルが多かれ少なかれ2つに分割されている場合、そのインデックスは使用されません。
同様に、インデックススキャンがそのテーブルにほぼすべての該当するディスクページにランダムにアクセスするようにデータが保存されている場合、プランナーは全表スキャンを優先します。
7。可能な場合は、部分/式インデックスを検討してください。
行の10%を除いて同じ値を持つフィールドがある場合は、そのフィールドの部分インデックスを検討してください(つまり、その値でない場合)。これにより、実際の有用性を妨げることなく、インデックスがはるかに小さくなります。
列に適用されている式に対して常にクエリを実行していて、プラットフォームが式インデックスを提供している場合は、それにインデックスを追加することを検討してください。使用すると、式は行ごとに評価されません。