PostgreSQLでは、B-tree、R-tree、GiST、Hashといった複数の種類のインデックスを使用可能です。 インデックスの各種類は、異なる種類の問い合わせに最も適した、異なるアルゴリズムを使用します。 デフォルトでは、CREATE INDEXコマンドはB-treeインデックスを作成します。 これは、ほとんどの一般的な状況に適するインデックスです。 B-treeインデックスは、ある順番でソート可能なデータに対する等価性や範囲を問い合わることを扱うことができます。 特に、PostgreSQLの問い合わせプランナでは、インデックスのついた列を次の演算子を使用して比較する場合に、B-treeインデックスの使用を検討します。 <, <=, =, >=, >
オプティマイザは、パターンマッチ演算子LIKE、ILIKE、~および~*を含む問い合わせでも、そのパターンが先頭文字を指定している場合B-treeインデックスを使用することができます。 例えば、col LIKE 'foo%'またはcol ~ '^foo'です。 col LIKE '%bar'では使用されません。 しかし、サーバがCロケールを使用していない場合、特別な演算子クラスでインデックスを作成しなければなりません。 後述の項11.6を参照してください。
R-treeインデックスは、特に空間的なデータに対する問い合わせに適しています。 R-treeインデックスを作成するには、以下のようなコマンドを使用してください。
CREATE INDEX name ON table USING RTREE (column);
PostgreSQLの問い合わせプランナでは、インデックスのついた列を次の演算子を使用して比較する場合に、R-tree インデックスの使用を検討します。 <<, &<, &>, >>, @, ~=, && (上記の演算子の意味については、項9.9を参照してください。)
ハッシュインデックスは単純な等価性比較のみを扱うことができます。 問い合わせプランナでは、インデックスのついた列を=演算子を使用して比較する場合に、ハッシュインデックスの使用を検討します。 ハッシュインデックスを作成するには、以下のようなコマンドを使用してください。
CREATE INDEX name ON table USING HASH (column);
注意: テストの結果、PostgreSQLでのハッシュインデックスの処理速度はB-treeインデックスより悪く、ハッシュインデックスのインデックスサイズおよび構築時間についてもかなり劣ることが分かりました。 これらの理由により、現在ハッシュインデックスの使用は推奨されていません。
B-treeインデックスは、Lehman-Yao高同時実行性B-treeの実装です。 R-treeインデックスメソッドは、Guttmanの二次分割アルゴリズムを使用した、標準R-treeを実装しています。 ハッシュインデックスメソッドは、Litwinの線形ハッシュの実装です。 使用されているアルゴリズムに言及したのは、これらのアクセスメソッドは完全に動的であり、(たとえば、静的ハッシュメソッドを使用する場合とは異なり)定期的に最適化する必要がないことを示すためです。