B-tree、Hash、GiST、GINインデックス
PostgreSQLの主要なインデックス種別を比較し、等価検索、範囲検索、ジオメトリ、JSON、全文検索に適したものを選びます。
「B-tree、Hash、GiST、GINインデックス」はCoddyKit上の無料SQL Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSQL Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 SQL Academyコースには全4レッスンが含まれています。
インデックスタイプの概要
PostgreSQL には複数のインデックスタイプがあり、それぞれ異なるアクセスパターンに最適化されています。
- B-tree — 等価検索と範囲検索(デフォルト)
- Hash — 等価検索のみ
- GiST — 幾何データ、全文検索、カスタム用途
- GIN — 複合値(配列、JSONB、全文検索)
- BRIN — ブロック範囲、大規模でソートされたテーブル
- SP-GiST — 空間分割木
B-tree:デフォルト
利用される場面の 95% を占めます。=、<、<=、>、>=、BETWEEN、ORDER BY をサポートします。
CREATE INDEX users_email_idx ON users(email);
CREATE INDEX orders_created_at_idx ON orders(created_at DESC);Hash インデックス
等価検索だけに使用します。PG 10 以降ではクラッシュセーフです。純粋な等価検索では B-tree より小さく、わずかに高速ですが、用途は非常に限定されます。
CREATE INDEX sessions_token_hash ON sessions USING HASH (token);
-- Useful for very high-cardinality equality lookups; usually B-tree is fine.GiST インデックス
Generalised Search Tree の略で、拡張可能な検索木です。範囲型、幾何型、IP アドレス、全文検索をサポートします。
CREATE INDEX events_during_idx ON events USING GIST (during);
-- 'during' is a tstzrange — finds overlapping ranges efficiently.
CREATE INDEX places_location_idx ON places USING GIST (location);
-- PostGIS geometry — nearest neighbour, intersects.GIN インデックス
Generalised Inverted Index の略で、各要素が多数の行に対応する複合値に最適です。
CREATE INDEX articles_tags_gin ON articles USING GIN (tags);
-- tags is TEXT[]; query with @> or && operators
CREATE INDEX articles_doc_gin ON articles USING GIN (search_doc);
-- For tsvector full-text search
CREATE INDEX events_data_gin ON events USING GIN (data jsonb_path_ops);
-- For JSONB containment queriesBRIN インデックス
Block Range INdexes の略で、N ページごとに値の範囲を要約します。非常に小さく、テラバイト規模のテーブルでも数キロバイト程度ですが、インデックス対象の列でデータが物理的にソートされている場合にのみ効果を発揮します。
CREATE INDEX events_ts_brin ON events USING BRIN (ts);
-- Excellent for append-only time-series tables.サイズの比較
10 億行のテーブルの場合:
- BIGINT に対する B-tree:約 30 GB
- TIMESTAMPTZ に対する BRIN:約 1 MB
BRIN は大幅に小さくなりますが、B-tree より有利なのは順次検索やソート済みデータに対するクエリだけです。
インデックスタイプの選び方
判断の流れ:
- スカラー値の等価検索 + 範囲検索 → B-tree
- 巨大なスカラー値集合に対する等価検索 → B-tree(Hash は計測した場合のみ)
- 配列 / JSONB / 全文検索 → GIN
- 範囲型、ジオメトリ、あいまいなテキスト検索 → GiST
- 非常に大規模でソート済みの追記専用テーブル → BRIN
GIN のトレードオフ
GIN は「X を含むすべての行を検索する」クエリでは最速ですが、B-tree より INSERT/UPDATE が遅くなります。書き込みが非常に多いテーブルでは、GIN の保留リストを制御するために fastupdate=off を検討してください。
演算子クラス
各インデックスタイプは、特定の演算子と組み合わせて動作します。JSONB では jsonb_path_ops を使うと、包含検索専用の、より小さく高速なインデックスを作成できます。
CREATE INDEX e_data_gin ON events USING GIN (data jsonb_path_ops);
-- Half the size of default jsonb_ops, supports @> only.タイプ別の複合インデックス
B-tree の複合インデックスは、左端のプレフィックスに一致する検索に使用されます。GIN の複合インデックスも使用できますが、サイズが大きくなるため、通常は列ごとに単一列の GIN インデックスを作成します。
まとめ
クエリに合ったインデックスタイプを選びます。
- B-tree:デフォルト
- GIN:配列 / JSONB / 全文検索
- GiST:範囲 / ジオメトリ / あいまい検索
- BRIN:順次処理 / 追記専用
確認問題
「包含」検索を行う TEXT[] 列にインデックスを作成するとします。適したインデックスタイプはどれですか。
AI チューターと学ぶ SQL — 無料
ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。
- コース
- 46
- レッスン
- 183
よくある質問
「B-tree、Hash、GiST、GINインデックス」レッスンは無料ですか?
はい。「B-tree、Hash、GiST、GINインデックス」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、SQL Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 SQL Academyコースには全4レッスンが含まれています。
「B-tree、Hash、GiST、GINインデックス」で何を学びますか?
PostgreSQLの主要なインデックス種別を比較し、等価検索、範囲検索、ジオメトリ、JSON、全文検索に適したものを選びます。 ブラウザで直接実行するハンズオンコードでSQL Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
SQL Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのSQL Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「B-tree、Hash、GiST、GINインデックス」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このSQL Academyレッスンでコードを書いて実行できますか?
はい。すべてのSQL Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- B-tree、Hash、GiST、GINインデックス
- 複合インデックスと列の順序
- 部分インデックスと式インデックス
- インデックスのメンテナンスと肥大化