【いんでっくす】

インデックス(データベース) とは?

💡 データベースの「索引」—検索速度を劇的に向上
📌 このページのポイント
フルスキャン vs インデックススキャン フルスキャン(遅い) ID:1 佐藤 東京 → ✗ ID:2 田中 大阪 → ✗ ID:3 鈴木 東京 → ✗ ID:4 山田 福岡 → ✓ HIT! ID:5 高橋 名古屋 → ✗ 全行を1つずつ確認… インデックススキャン(速い) 名前索引 さ〜た行 は〜や行 山田 → ID:4 索引で一発検索! インデックスなし: O(n) インデックスあり: O(log n)
インデックス(データベース)のイメージ
ひよこ ひよこ

インデックスがないとどうなるの?

ペンギン先生 ペンギン先生

100万行のテーブルから1件を検索するとき、インデックスがないと全行を順番にチェック(フルテーブルスキャン)。100万回の比較が必要。インデックスがあればB-Treeで約20回の比較で見つかる。検索速度が5万倍になるイメージだよ

ひよこ ひよこ

どのカラムにインデックスを作るべき?

ペンギン先生 ペンギン先生

①WHERE句で頻繁に使うカラム、②JOINの結合キー、③ORDER BYで使うカラム、④ユニーク制約のあるカラム(自動作成される)。ただし①カーディナリティ(値の種類)が低いカラム(例:性別)はインデックスの効果が薄い。②頻繁にUPDATEされるカラムはインデックスの更新コストが高いよ

ひよこ ひよこ

複合インデックスって何?

ペンギン先生 ペンギン先生

複数のカラムを組み合わせたインデックスだよ。「WHERE name = 'Tanaka' AND department = 'Engineering'」のようなクエリに対して、(name, department)の複合インデックスを作ると効率的。ただし「最左プレフィックスルール」があり、先頭のカラムがWHEREに含まれないとインデックスが使われないよ

ひよこ ひよこ

インデックスの確認方法は?

ペンギン先生 ペンギン先生

EXPLAINMySQL/PostgreSQL)文でクエリ実行計画を確認できるよ。「type: ALL」はフルスキャン(遅い)、「type: ref/index」はインデックス使用(速い)。rows(スキャン行数)が少ないほど効率的。本番の遅いクエリはまずEXPLAINで調べてインデックスの追加を検討するのが基本だね

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「インデックス」って出てきたら「DB検索を高速化する索引データ」と思えればだいたいOK!
📖 おまけ:英語の意味
「Database Index」 = データベース索引
💬 Index(索引)。本の後ろにある「あ行→○ページ」のような仕組みをDBに適用したよ
← 用語集にもどる