* pg_trgm *拡張子の付いたPostgresql9.1を使用しています。テキストベースのフィールドにインデックスを作成する必要があります。全文検索は必要ありません。検索にはILIKE
クエリを使用します。
私が使用します pg_trgm
ですが、gin
およびGist
インデックスの経験はあまりありません。 INSERT
ステートメントは多数(1日あたり約15000)、UPDATE
ステートメントはごくわずか(1週間に1つか2つ)になります。
そのようなテーブルのgin
インデックスのインデックス更新オーバーヘッドはどうなりますか?または、Gist
の方が適していますか?
Pg_trgmモジュールのマニュアルには、質問に対するアドバイスがいくつかあります ここ :
経験則として、GINインデックスはGistインデックスよりも検索が高速ですが、構築または更新には時間がかかります。したがって、GINは静的データに、Gistは頻繁に更新されるデータに適しています。
FASTUPDATE
GINインデックスの機能(Postgres 8.4で導入され、デフォルトでON)は、君は。 INSERT(およびUPDATE)は保留リストに格納され、後の一括操作でVACUUM
によってインデックスに統合されます。 GINの直接メンテナンスは、特に多くのインデックス可能な要素、つまり多くの単語を含む列の場合、コストがかかる傾向があるため、これらの操作が大幅に高速化されます。
こちらのマニュアルにあるGINとGistの基本的なアドバイス
特に、行が大きく、まとめて挿入する場合は、 work_mem
設定 。
非常に大きな負荷(テーブルの大部分)の場合、インデックスを削除して後で再作成するのにお金がかかる場合があります。
1日で15,000行が広がっていますが、まったく問題にはならないはずです。
最後に、全文検索セクションに GINとGistのパフォーマンスに関する章全体 があります。一般的に適用されます。これを読む。
その要点(しゃれは意図されていません):GINはかなり大きく、維持するのに費用がかかりますが、ほとんどのルックアップでは高速です( pg_trgmには特別な例外が適用されます )。 FASTUPDATE
書き込みの追加は、適度にコストがかかるだけなので。