Postgresは、B-tree, R-tree, Hash といった インデックス型を提供しています。それぞれのインデックス型は、使う アルゴリズムのために、特定の問い合わせ型に相応しいようになっています。 デフォルトではCREATE INDEXコマンドが B-tree インデックス を作り、これは大体の一般的な状況に適切です。特にPostgres の問い合わせオプティマイザは、インデックスのついたカラム が下記のような演算子のついた比較で使われる度に、B-tree の使用 を検討します。 <, <=, =, >=, >
R-tree インデックスは特に空間的データに適しています。R-tree インデックス を作るためには、下記のようなコマンドを使って下さい。
CREATE INDEX name ON table USING RTREE (column);Postgresの問い合わせオプティマイザは インデックスのついたカラムが下記の演算子のいずれかを使った比較で 使われる度に、R-tree インデックスの使用を検討します。 <<, &<, &>, >>, @, ~=, && これらの演算子の意味についてはSection 4.8 を参照して下さい。
問い合わせオプティマイザは、インデックスのついたカラムが = 演算子を使った比較で使われる度に、hash インデックス の使用を検討します。hash インデックスを作るためには下記のコマンド が使われます。
CREATE INDEX name ON table USING HASH (column);
Note: hash インデックスの限られた有用性のために、通常はB-tree インデックスの ほうが hash インデックスよりも好まれます。=の比較でさえも B-tree よりも hash のほうが速いという確かな証拠はありません。 更に hash インデックスは粒度の粗いロックを必要とします。 Section 9.7を参照して下さい。
B-tree インデックスは Lehman-Yao 高同時実行性 B-tree の実装です。 R-tree インデックスメソッドは Guttman の二次分割アルゴリズムを使った標準 R-tree を実装しています。hash インデックスは Litwin の線形ハッシュの 実装です。ここでは、これらのアクセスメソッドは完全に動的であり、 定期的に最適化される必要がない(例えば、静的 hash アクセスメソッド のような場合)ということを示すためだけにアルゴリズムについて 言及しています。