☁️はじめに:
SQLを学んでいるとよく聞く「インデックスを貼る」という言葉。
でも、実際に何をしていて、どう使えばいいのかイメージが湧きづらいですよね。
この記事では、私が作った「カフェのデータベース」を使って、インデックスの基本から実践までわかりやすく解説します。
1. インデックスとは?
インデックスとは、テーブル内のデータを高速に検索するための「索引」のようなものです。
図書館の「本の目次」と同じで、目次(インデックス)があれば目的の情報にすぐアクセスできます。
2. カフェSQLのデータ構造
カフェのレビューやメニューを管理するため、以下のようなテーブルを作っています(一部抜粋):
food.cafes
:カフェ情報(名前、場所、オープン日)food.reviews
:レビュー(カフェID、評価、レビュー日)food.menu_items
:メニュー(名前、カテゴリ、価格)food.cafe_menu
:中間テーブル(カフェとメニューの多対多
3. インデックスがないとどうなる?
SELECT * FROM food.reviews WHERE cafe_id = 1;
このように「特定のカフェのレビュー」を検索したいとき、cafe_id
にインデックスがなければ…
データベースは 全レビューを1件ずつ調べて一致するものを探します(= フルスキャン)
データ量が増えると、めちゃくちゃ遅くなります。
4. インデックスを貼ってみる!
CREATE INDEX idx_reviews_cafe_id
ON food.reviews (cafe_id);
これで cafe_id
での検索が高速化されます。
インデックスは内部的にB-tree(木構造)として管理され、目的のデータに素早くアクセスできます。
B-tree(木構造)ってなに?
これは効率よくデータを探すためのしくみです。
イメージ:
[10]
/ \
[1~9] [11~20]
上のように「大きさの順」で分岐しながら探す構造になっていて、
- 探したい値が「10より小さい」なら左へ
- 「10より大きい」なら右へ
…というように、最大でも数回の分岐で目的の値にたどり着ける仕組みです。
📚 例えるなら:
・インデックスなし=ノート1冊を最初から最後まで全部めくって探す。
・インデックスあり(B-tree)=目次がついてて、必要なページにすぐジャンプできる。
まとめると、以下の通りである。
「インデックスを貼る」とは、検索に使う列の値をあらかじめ整理された構造(B-tree)で記録しておくこと。
これによって、検索時に最短ルートでデータを見つけられるようになる。
5. 本当に速くなった?(EXPLAINで検証)
EXPLAIN ANALYZE
SELECT * FROM food.reviews WHERE cafe_id = 1;
- インデックスが使われていないと:
Seq Scan
(全件スキャン) - インデックスが使われると:
Index Scan
やBitmap Index Scan
これで実際にインデックスの効果を可視化できます。
6. カフェSQLでインデックスを貼るべき列
テーブル | 列 | 理由 |
---|---|---|
food.reviews | cafe_id | カフェ別レビューの検索や集計が多い |
food.menu_items | category_id | カテゴリ別メニュー表示によく使う |
food.cafe_menu | cafe_id , menu_item_id | JOIN時によく使われる |
7. インデックスの注意点
- インデックスを貼ると検索は速くなるが、更新・削除・挿入がやや遅くなります(インデックスの更新が必要なため)。
- 小さいテーブルには不要なこともあります。
- よく検索条件やJOINで使う列だけに貼るのがコツです。
おわりに🎀
「インデックスを貼る」とは何か、そして実際にどう効果があるのか、少しイメージがついたのではないでしょうか?
カフェSQLのようなシンプルなデータ構造でも、インデックスの威力は十分に感じられます。
ぜひ他のプロジェクトでも試してみてください!
コメント