【じんいんでっくす】
GINインデックス とは?
最終更新:
💡 要素から該当する行を探す、逆引きの索引
GINインデックスはPostgreSQLの汎用転置インデックス。要素から該当行を探す仕組みで、全文検索・配列・JSONBなどを支えます。対応する演算子、更新コスト、検索計画の確認が重要です。
📌 このページのポイント
GINは普通の索引と何が違うの?
PostgreSQLで標準のB-treeは等価・範囲検索や並び順などに使えるよ。GINはひとつの値に含まれる要素を取り出し、その要素が現れる行を探す転置インデックスなんだ。役割が違うから、条件に合わせて選ぶよ。
逆引きって、どういうこと?
配列やJSONBなら、どんな検索でも速くなる?
データを更新するときの負担は?
1行から複数の索引要素を更新するため、追加・更新のコストや索引の容量に注意するよ。fastupdateは更新を一時的な待ちリストへまとめる方式だけど、その掃除や検索への影響もある。書き込みが多いからGiSTへ替えれば必ず解決する、とは言えないんだ。
GINを作れば、必ずその索引を使ってくれる?
必ずではないよ。検索に合う式でも、行数や該当件数などから全体を走査する計画が選ばれることがある。実際の条件とデータでEXPLAINなどを確認し、読み取りの改善と書き込みの負担を比べよう。
もっと詳しく知りたい人へ
jsonb_opsとjsonb_path_opsは何が違う?
既定のjsonb_opsは包含やjsonpath条件に加え、キー存在の?・?|・?&に対応します。jsonb_path_opsは@>・@?・@@に対応し、キー存在演算子には対応しません。単にJSONBだから一方を選ぶのではなく、実際の検索条件に合わせて判断します。
まとめ:ざっくりこれだけ覚えればOK!
「GINインデックス」って出てきたら「データの要素から該当行を逆引きするPostgreSQLの索引」と思えばだいたいOK!
📖 おまけ:英語の意味
「Generalized Inverted Index」 = 汎用転置インデックス
💬 inverted index(転置インデックス)を汎用化(generalized)したものだよ。GINという略語がジンのお酒みたいだけど、中身はかなり高度な技術なんだ