PostgreSQL では、B-tree、R-tree、GiST、Hash といったいくつかのインデックス型を使用可能です。 使用するアルゴリズムに応じて、各インデックス型はそれぞれ特定の問い合わせ型での使用に適します。 デフォルトでは、CREATE INDEX コマンドを使用すると B-tree インデックスが作成されます。これは、ほとんどの一般的な状況に適するインデックスです。 特に、PostgreSQL の問い合わせオプティマイザでは、インデックスのついた列を次の演算子を使用して比較する場合に、B-tree インデックスの使用を検討します。 <, <=, =, >=, >
R-tree インデックスは、特に空間的なデータに適しています。 R-tree インデックスを作成するには、以下のようなコマンドを使用してください。
CREATE INDEX name ON table USING RTREE (column);
PostgreSQL の問い合わせオプティマイザでは、インデックスのついた列を次の演算子を使用して比較する場合に、R-tree インデックスの使用を検討します。 <<, &<, &>, >>, @, ~=, && (上記の演算子の意味については、Section 6.9 を参照してください。)
問い合わせオプティマイザでは、インデックスのついた列を = 演算子を使用して比較する場合に、hash インデックスの使用を検討します。 hash インデックスを作成するには、以下のようなコマンドを使用してください。
CREATE INDEX name ON table USING HASH (column);
Note: テストの結果、PostgreSQL での hash インデックスの処理速度は B-tree インデックスと同等あるいはそれ以下で、必要なインデックスサイズおよび構築時間についても B-tree インデックスよりかなり劣ることが分かりました。 また、hash インデックスは、高同時実行状況下でのパフォーマンスも良くありません。 これらの理由により、hash インデックスの使用は推奨されていません。
B-tree インデックスは、Lehman-Yao 高同時実行性 B-tree の実装です。 R-tree インデックスメソッドは、Guttman の二次分割アルゴリズムを使用した、標準 R-tree を実装しています。 hash インデックスは、Litwin の線形ハッシュの実装です。 使用されているアルゴリズムに言及したのは、これらのアクセスメソッドは完全に動的であり、(たとえば、静的 hash アクセスメソッドを使用する場合とは異なり) 定期的に最適化する必要がないことを示すためです。