☕️ カフェSQLで学ぶ!「インデックスを貼る」とは何か?

IT

☁️はじめに:

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 ScanBitmap Index Scan

これで実際にインデックスの効果を可視化できます。

6. カフェSQLでインデックスを貼るべき列

テーブル理由
food.reviewscafe_idカフェ別レビューの検索や集計が多い
food.menu_itemscategory_idカテゴリ別メニュー表示によく使う
food.cafe_menucafe_id, menu_item_idJOIN時によく使われる

7. インデックスの注意点

  • インデックスを貼ると検索は速くなるが、更新・削除・挿入がやや遅くなります(インデックスの更新が必要なため)。
  • 小さいテーブルには不要なこともあります。
  • よく検索条件やJOINで使う列だけに貼るのがコツです。

おわりに🎀

「インデックスを貼る」とは何か、そして実際にどう効果があるのか、少しイメージがついたのではないでしょうか?

カフェSQLのようなシンプルなデータ構造でも、インデックスの威力は十分に感じられます。
ぜひ他のプロジェクトでも試してみてください!

コメント

タイトルとURLをコピーしました