GIN インデックス
PostgreSQL の GIN インデックスとは?
GIN(汎用転置)インデックスは、配列の要素、JSONB のキー、テキスト検索の単語など、値の内部にある各要素を、それを含む行に対応付けます。
GIN は Generalized Inverted Index(汎用転置インデックス)の略です。インデックス対象の各項目が複数の要素を含む複合的な値と、特定の要素を含む項目を探すクエリのために設計されています。代表的な用途は、配列、jsonb、全文検索です。
デフォルトの演算子クラスでは、GIN は配列に対して @>(包含)や &&(重なり)などの演算子を、jsonb に対して @> とキー存在演算子をサポートします。検索は高速ですが、挿入と更新のコストは B-tree より高くなります。デフォルトで有効な fastupdate ストレージパラメータは、新しいエントリを保留リストにバッファリングして、このコストを軽減します。
例
この例では、text[] 列に GIN インデックスを作成し、tags に t42 を含む行について EXPLAIN で確認します。出力には docs_tags_gin に対する Bitmap Index Scan が表示されます。
CREATE TABLE docs (id int PRIMARY KEY, tags text[]);
INSERT INTO docs
SELECT g, ARRAY['t' || (g % 100), 'u' || (g % 7)] FROM generate_series(1, 100000) AS g;
CREATE INDEX docs_tags_gin ON docs USING gin (tags);
ANALYZE docs;
EXPLAIN SELECT id FROM docs WHERE tags @> ARRAY['t42'];拡張機能なしの標準の PostgreSQL 16 または 17 で動くプレーンな SQL です。破棄してかまわない空のデータベースで実行してください。
出典
PostgreSQL 公式ドキュメント(英語)。