1. ホーム
  2. postgresql

GiSTとGIN指数の違い

2023-08-23 01:35:42

質問

テーブルを実装しているのですが、データ型が tsvector というデータ型のカラムを持つテーブルを実装しているのですが、どのようなインデックスを使用するのが良いのか理解しようとしています。

GINかGiSTか?

を調べてみると postgres documentation here というのが出てくるようです。

  • GiSTはインデックスを更新して構築するのが速く、ginより精度が低いです。

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

OK、では、なぜ誰もがginよりもgistのインデックスを持つフィールドを欲しがるのでしょうか?もし、gistが間違った結果を与える可能性があるとしたら?これには(パフォーマンス以外の)何らかの利点があるはずです。

どなたか、GINとGiSTをいつ使いたいのか、平易な言葉で説明していただけませんか?

どのように解決するのですか?

これ以上うまく説明できるとは思えませんが マニュアル がすでに行っています。

<ブロッククオート

GiSTとGIN、どちらのインデックスタイプを使用するかを選択する際には、以下の点を考慮してください。 パフォーマンスの違いを考慮してください。

  • GIN インデックス検索は GiST よりも約 3 倍高速です。

  • GIN インデックスの構築には GiST の約 3 倍の時間がかかる

  • GINインデックスはGiSTインデックスよりも更新が中程度に遅いが、高速更新のサポートが無効な場合は約10倍遅くなる[...]

  • GIN インデックスは GiST インデックスより 2 ~ 3 倍大きい。

リンクと引用は、Postgres 9.4のマニュアルを参照しています。サイズとパフォーマンスの見積もりは、すでに若干古くなっているようでした。 Postgres 9.4では、確率は大幅に変化しました。 GINに有利になります。 .

のリリースノートでは、Postgres 9.4 が含まれます。

  • GINインデックスサイズを縮小しました。(Alexander Korotkov, Heikki Linnakangas) [...]

  • マルチキーGINルックアップの速度を向上させました。 Linnakangas)

サイズと性能の見積もりは、その後、マニュアルから削除されました。

があることに注意してください。 特別な使用例 があり、どちらか一方を必要とすることに注意してください。

ひとつ誤解されていることがあります。 決して は、GiSTインデックスで間違った結果を得ることはありません。このインデックスはハッシュ値で動作し はインデックスで偽陽性を引き起こす可能性があります。これは、ドキュメントに非常に多くの異なる単語がある場合にのみ関係するはずです。誤検出は、どのような場合でも実際の行を再確認した後に排除されます。 マニュアル :

<ブロッククオート

GiSTインデックスは非可逆的であり、インデックスが偽のマッチを生成する可能性があります。 を生成する可能性があり、そのような偽のマッチを排除するために実際のテーブル行をチェックする必要があります。 そのような誤ったマッチを排除するために、実際のテーブル行をチェックする必要があります。( PostgreSQLは必要な時にこれを自動的に行います。 )

太字強調は私です。