SQL Academy · レッスン

B-tree、Hash、GiST、GINインデックス

PostgreSQLの主要なインデックス種別を比較し、等価検索、範囲検索、ジオメトリ、JSON、全文検索に適したものを選びます。

レッスン 1/413 ステップ

「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 queries

BRIN インデックス

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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. B-tree、Hash、GiST、GINインデックス
  2. 複合インデックスと列の順序
  3. 部分インデックスと式インデックス
  4. インデックスのメンテナンスと肥大化
← SQL Academyに戻る