PostgreSQLインデックス入門
クエリを高速化する仕組み
PostgreSQLのインデックスの種類、作成方法、パフォーマンスへの影響を解説します。
こんな人向けの記事です
- クエリの実行速度を改善したい人
- インデックスの種類と使い分けを知りたい人
- インデックスの管理方法を学びたい人
Step 1インデックスとは
インデックスは、テーブル内のデータを高速に検索するための仕組みです。本の索引のように、目的のデータの場所を素早く特定できます。
トレードオフ: インデックスは検索を高速化しますが、INSERT/UPDATE/DELETE時にインデックスの更新が発生するため、書き込み性能には影響があります。
Step 2インデックスの作成
SQL
-- 基本的なインデックス
CREATE INDEX idx_user_email ON users(email);
-- 複合インデックス
CREATE INDEX idx_orders_user_date ON orders(user_id, order_date);
-- ユニークインデックス
CREATE UNIQUE INDEX idx_unique_username ON users(username);
-- 部分インデックス(条件付き)
CREATE INDEX idx_active_users ON users(user_id) WHERE is_active = TRUE;
Step 3インデックスの種類
| 種類 | 用途 | 特徴 |
|---|---|---|
| B-tree(デフォルト) | 等価・範囲検索 | 最も汎用的 |
| Hash | 等価検索のみ | B-treeより高速な場合あり |
| GIN | 全文検索、配列 | 複数値を含むカラム向け |
| GiST | 地理データ、範囲型 | 空間検索向け |
| BRIN | 大規模テーブル | サイズが小さく高速 |
Step 4インデックスの管理
SQL
-- テーブルのインデックス一覧
\di+ テーブル名
-- インデックスの削除
DROP INDEX idx_user_email;
-- インデックスの使用状況確認
EXPLAIN ANALYZE SELECT * FROM users WHERE email = 'test@example.com';
-- インデックスの再構築
REINDEX INDEX idx_user_email;
Step 5インデックス設計のベストプラクティス
- WHERE句やJOIN条件で頻繁に使われるカラムにインデックスを作成する
- カーディナリティ(値の種類数)が高いカラムほどインデックスの効果が大きい
- 過剰なインデックスは書き込み性能を低下させるので必要最小限にする
EXPLAIN ANALYZEでクエリプランを確認し、効果を検証する
注意: PRIMARY KEYとUNIQUE制約には自動的にインデックスが作成されるため、重複して作成する必要はありません。