デフォルトのB-treeを超えて、PostgreSQLは複数の特殊なインデックスタイプ — GIN、GiST、BRIN、Hash — を提供しており、それぞれ異なるデータとクエリパターンに適しており、さらに部分インデックスと式インデックスで柔軟性を提供しています。適切なインデックスタイプを選択することで、特殊なクエリのパフォーマンスを劇的に向上させることができます。
デフォルトのB-treeを超えて、PostgreSQLは複数の特殊なインデックスタイプ — GIN、GiST、BRIN、Hash — を提供しており、それぞれ異なるデータとクエリパターンに適しており、さらに部分インデックスと式インデックスで柔軟性を提供しています。適切なインデックスタイプを選択することで、特殊なクエリのパフォーマンスを劇的に向上させることができます。
CREATE INDEX idx_users_email ON users(email); -- default = B-tree
-- great for: equality (=), ranges (<, >, BETWEEN), sorting (ORDER BY), most queries
B-treeはデフォルトであり、大多数のケース — 等値、範囲、通常の列のソート — に対応しています。
-- GIN (Generalized Inverted Index) — for values CONTAINING multiple items
CREATE INDEX idx_attrs ON products USING GIN (attributes); -- JSONB
CREATE INDEX idx_tags ON posts USING GIN (tags); -- arrays
CREATE INDEX idx_search ON docs USING GIN (to_tsvector('english', body)); -- full-text
-- great for: JSONB containment, array membership, full-text search
GINインデックスはJSONB、配列、全文検索 — 包含またはメンバーシップをチェックするクエリ — に不可欠です。
-- GiST — geometric, range, nearest-neighbor (e.g. PostGIS, range types)
CREATE INDEX idx_geo ON places USING GiST (location);
-- BRIN (Block Range INdex) — tiny index for LARGE tables with naturally-ordered data
CREATE INDEX idx_time ON logs USING BRIN (created_at); -- great for huge time-series
-- tiny size, efficient for large append-only/ordered data
-- Hash — equality only (=); rarely needed (B-tree handles equality too)
CREATE INDEX idx_hash ON t USING HASH (col);
-- PARTIAL index — index only SOME rows (smaller, targeted)
CREATE INDEX idx_active ON users(email) WHERE active = true; -- only active users
-- EXPRESSION index — index a computed value
CREATE INDEX idx_lower_email ON users(LOWER(email)); -- for case-insensitive lookups
SELECT * FROM users WHERE LOWER(email) = '[email protected]'; -- uses the index
部分インデックス(関連する行のみをインデックス化 — より小さく高速)と式インデックス(計算値をインデックス化 — インデックス付き関数ベースのクエリを実現)は強力で柔軟なツールです。
PostgreSQLの豊富なインデックスタイプの種類を理解することは、パフォーマンス最適化のための貴重な知識です。なぜなら、与えられたデータとクエリパターンに対して適切なインデックスタイプを選択することで、デフォルトのB-treeが非効率に処理するか処理できないクエリを劇的に高速化できるからです。
B-tree(デフォルト)はほとんどのケース(等値、範囲、ソート)をカバーしていますが、特殊なタイプは特殊なデータのパフォーマンスを解放します: GINはJSONB、配列、全文検索に不可欠です(包含/メンバーシップクエリ — PostgreSQLの強力なJSONBと配列機能をパフォーマンスに優れたものにする);GiSTは幾何学的、範囲、最近傍クエリに対応します(PostGIS地理空間、範囲タイプ);BRINは大規模な自然順序のテーブルに対して小さく効率的なインデックスを提供します(時系列/追記型データのような大規模テーブルでB-tree全体が高くつく場合の貴重なオプション)。
どのシナリオにどのインデックスタイプが適しているか(JSONB/配列/全文検索にはGIN、幾何学的/範囲にはGiST、大規模順序付きデータにはBRIN)を知ることは、PostgreSQLの高度な機能を最適化するための鍵です。
同等に貴重なのは部分インデックス(関連する行のみをインデックス化 — アクティブユーザーのようなサブセットをクエリする場合、より小さく効率的)と式インデックス(計算値をインデックス化 — 大文字小文字を区別しないメール検索のような高速な関数ベースのルックアップを実現、通常のインデックスではサポートできない)です。
インデックスの選択はクエリパフォーマンスに大きく影響し、PostgreSQLの特殊なインデックスタイプ(特にJSONB/配列/全文検索用のGIN)はその高度なデータ型をパフォーマンスに優れたものにするものであるため、インデックスタイプを理解し各々をいつ使用するか — 部分インデックスと式インデックスを含む — を知ることは、PostgreSQLデータベースを最適化するための貴重で頻繁に関連する知識であり、多様なクエリパターンに対してPostgreSQLを高速にできる開発者を区別するものであり、データベースの完全なパフォーマンス機能を活用するための重要な側面です。