【いんでっくす】

インデックス(DB) とは?

💡 DBの「索引」、検索を劇的に速くする補助データ構造
📌 このページのポイント
インデックスなし 検索 id name email 1 田中 ... 2 佐藤 ... 3 鈴木 ... 4 山田 ... ... 999 中村 ... 1000 高橋 ... フルテーブルスキャン O(n) - 全行を順番に走査 インデックスあり さ行 あ-さ た-わ あ-か さ-た 高橋 → id:1000 → データ行を直接取得 B-Treeインデックス検索 O(log n) - 少ない比較で到達 VS
データベースインデックスの効果
ひよこ ひよこ

インデックスって何?

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

本の「索引(index)」と全く同じ仕組み。「Aという単語はp.123にある」という索引があれば全ページを読まずに目的のページに飛べる。DBインデックスも同じで、「emailがtest@example.comの行はここにある」という索引で全行スキャンを省ける。

ひよこ ひよこ

インデックスを付けすぎると問題ある?

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

ある。書き込み(INSERT・UPDATE・DELETE)のたびにインデックスも更新する必要があるからオーバーヘッドが増える。またインデックス自体もディスク容量を使う。使用頻度の高い検索カラムに絞って適切に作るのが重要。

ひよこ ひよこ

インデックスがないとどれくらい遅い?

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

1000万行のテーブルインデックスなしのWHERE検索は全行スキャンで数秒〜数十秒かかることも。インデックスがあれば0.001秒以下で見つかることが多い。遅いクエリのチューニングはほぼ必ずインデックスの確認から始まる。

ひよこ ひよこ

インデックスを作りすぎるとダメなの?

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

そうなんだ。インデックスがあるとSELECTは速くなるけど、INSERT/UPDATE/DELETEのたびにインデックスも更新する必要があるから書き込みが遅くなるよ。ディスク容量も食うしね。実はPostgreSQLの「EXPLAIN ANALYZE」やMySQLの「EXPLAIN」コマンドで、クエリが実際にインデックスを使っているか確認できるんだ。作ったのに使われていない「未使用インデックス」を見つけて削除するのも重要なチューニング。pg_stat_user_indexesで各インデックスの使用回数を確認できるから、定期的にチェックするといいよ。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
インデックスって出てきたら「DBの検索を速くするための索引データ構造、WHEREで使うカラムに設定する」と思えばOK!
📖 おまけ:英語の意味
「Index」 = 索引・指し示すもの
💬 本の「索引(index)」と同じ概念。すべてのページ(行)を読まずに目的のページ(行)を素早く見つけるための仕組み
← 用語集にもどる