~/VibeHandbook
無料 PDF

14 · 05

インデックス

インデックス は本の巻末索引のようなものです。データベースがすべての行をスキャンする代わりに、一致する行へ直接ジャンプできるようにします。インデックスがなければ、データが増えるにつれてクエリは遅くなります — 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_idemail)。
  • 主キーは自動的にインデックスが張られます。
  • すべてにインデックスを張らない — 各インデックスは読み取りを速くしますが、書き込みを遅くし、容量を使います。
  • 遅いクエリを見たときにインデックスを追加します。すべてのカラムに先回りで張るのではなく。

インデックスが効くかどうかを知る正直な方法は、当てずっぽうではなくデータベースに尋ねることです。どのエンジンにも、使う計画を見せてくれる EXPLAIN (Postgresでは EXPLAIN ANALYZE) があります:

EXPLAIN ANALYZE
SELECT * FROM posts WHERE author_id = '...';

大きなテーブルで出力が Seq Scan と言うなら、データベースはすべての行を読んでいます — インデックスが効くというサインです。1つ追加すれば Index Scan に切り替わるはずです。これはAIに渡すのに最適な作業です: 遅いクエリと EXPLAIN の出力を貼り付け、どのインデックスを追加すべきか、なぜかを尋ねましょう。あなたはインデックス理論を暗記するのではなく、答えを理解することで主導権を保ちます。

オフラインでも読みたい?

本編まるごとを PDF または EPUB で無料ダウンロード。