インデックス
インデックス は本の巻末索引のようなものです。データベースがすべての行をスキャンする代わりに、一致する行へ直接ジャンプできるようにします。インデックスがなければ、データが増えるにつれてクエリは遅くなります — 100行なら問題なくても、1,000,000行では苦痛です。
インデックスがなければデータベースは1行ずつすべてを確認し、あればぴったりの行へ直接ジャンプします。本の索引が最初から最後まで読む代わりに正しいページへ送ってくれるのと同じです:
NO INDEX (Seq Scan) WITH INDEX (Index Scan)
全 row を1つずつ読む 一致へ直接ジャンプ
┌─────────────────────┐ ┌─────────────┐
│ row 1 ✗ │ │ INDEX │
│ row 2 ✗ │ │ author_id │
│ row 3 ✓ 一致 │ ◀──────┐ │ ──┬── │
│ row 4 ✗ │ │ └─────┼───────┘
│ ... (1,000,000) │ │ ▼
│ row N ✓ 一致 │ └──▶ rows 3, 998 ✓
└─────────────────────┘ 百万回ではなく数回のジャンプ
実践的な指針:
- 頻繁に フィルタ または 結合 (join) するカラムにインデックスを張る (例:
author_id、email)。 - 主キーは自動的にインデックスが張られます。
- すべてにインデックスを張らない — 各インデックスは読み取りを速くしますが、書き込みを遅くし、容量を使います。
- 遅いクエリを見たときにインデックスを追加します。すべてのカラムに先回りで張るのではなく。
インデックスが効くかどうかを知る正直な方法は、当てずっぽうではなくデータベースに尋ねることです。どのエンジンにも、使う計画を見せてくれる EXPLAIN (Postgresでは EXPLAIN ANALYZE) があります:
EXPLAIN ANALYZE
SELECT * FROM posts WHERE author_id = '...';
大きなテーブルで出力が Seq Scan と言うなら、データベースはすべての行を読んでいます — インデックスが効くというサインです。1つ追加すれば Index Scan に切り替わるはずです。これはAIに渡すのに最適な作業です: 遅いクエリと EXPLAIN の出力を貼り付け、どのインデックスを追加すべきか、なぜかを尋ねましょう。あなたはインデックス理論を暗記するのではなく、答えを理解することで主導権を保ちます。