web-dev-qa-db-ja.com

GistとGINインデックスの違い

データ型がtsvectorの列を持つテーブルを実装していますが、どのインデックスを使用するほうがよいかを理解しようとしていますか?

GINまたはGiST?

postgresのドキュメントはこちら を見てみると、それがわかるようです:

  • Gistは、インデックスの更新と構築が高速で、ginよりも正確ではありません。

  • GINは、インデックスの更新と構築に時間がかかりますが、より正確です。

じゃあ、なぜジンのGistインデックスフィールドが必要なのでしょうか? Gistが間違った結果を与える可能性がある場合これにはいくつかの利点(外部パフォーマンス)が必要です。

GIN vs. GiSTを使用したいとき、誰でも素人の言葉で説明できますか?

42
Walker Farrow

マニュアル が既に説明しているよりも、もっとうまく説明できるとは思わない:

使用するインデックスタイプ(GistまたはGIN)を選択する際には、これらのパフォーマンスの違いを考慮してください。

  • GINインデックスのルックアップはGistの約3倍高速です

  • GINインデックスの構築には、Gistの約3倍の時間がかかります

  • GINインデックスはGistインデックスよりも更新がやや遅くなりますが、高速更新サポートが無効になっている場合は約10倍遅くなります[...]

  • GINインデックスは、Gistインデックスよりも2〜3倍大きい

リンクはcurrentマニュアルへの引用であり、引用は9.4のバージョンからのものですが、リンクはバージョン9.1(何らかの理由で?)へのものです。

マニュアルでは、サイズとパフォーマンスの見積もりは少し時代遅れに思えますが、その後削除されました。
Postgres 9.4では、オッズは実質的にシフトしてGIN)になりました
Postgres 9.4のリリースノート には以下が含まれます。

  • GINインデックスサイズを小さくする(Alexander Korotkov、Heikki Linnakangas)[...]

  • マルチキーGINルックアップの速度を改善しました(Alexander Korotkov、Heikki Linnakangas)

特別なユースケース があり、どちらか一方が必要であることに注意してください。

あなたが誤解した1つのこと:あなたneverは、Gistインデックスで間違った結果を取得します。インデックスはハッシュ値で動作します。これはcanインデックスの誤検知につながります。これは、ドキュメント内の非常に多くの異なる単語にのみ関連するようになります。いずれの場合でも、実際の行を再チェックした後、誤検知は排除されます。 マニュアル

Gistインデックスは損失が多いため、インデックスが誤った一致を生成する可能性があるため、実際のテーブル行をチェックして、そのような誤った一致を排除する必要があります。 (PostgreSQLは必要に応じてこれを自動的に行います。

大胆な強調鉱山。

68