【入門編】 複合インデックス (Composite Index) – PostgreSQL

データベースの「辞書」を上手に使いこなそう!複合インデックスの賢い並べ方

こんにちは!データベースの世界へようこそ。
普段、私たちが何気なく使っているアプリやWebサイト。その裏側では、膨大なデータが猛スピードで検索されています。

「どうしてあんなに一瞬でデータが見つかるんだろう?」と不思議に思ったことはありませんか?
その秘密兵器こそが「インデックス(索引)」です。

今日は、その中でも少しだけ応用編、「複合インデックス」という考え方を、日常のちょっとした例えで一緒に紐解いていきましょう。

—

インデックスは「本の巻末索引」と同じ

まず、インデックスの基本をおさらいしましょう。
データベースのインデックスは、辞書や本の巻末にある「索引」のようなものです。

もし、辞書に索引がなかったらどうなるでしょう?
「あ」から「ん」まで、ページを1枚ずつめくって目的の言葉を探さなきゃいけませんよね。これでは日が暮れてしまいます。

インデックスを貼るということは、「このデータはここにあるよ!」という付箋を貼るようなもの。これで検索は劇的に速くなります。

—

複数の条件で探すときは「複合インデックス」

では、こんな状況を想像してみてください。
あなたは図書館で本を探しています。でも、本のタイトルだけでは見つからず、こんな条件で探すことになりました。

1. まずは「ジャンル」を絞る(例:歴史)
2. 次に「著者名」を絞る(例:山田太郎)

このとき、図書館の棚が「ジャンルごと」に分かれていて、その中でさらに「著者名順」に並んでいたら最高ですよね?

これが「複合インデックス」です。
1つの列だけでなく、複数の列を組み合わせた「最強の並び順」をデータベースに作っておくイメージですね。

—

順番が命!「カレーの材料」で考えてみる

ここで一つ、大事なポイントがあります。それは「列の順番」です。

例えば、「カレーを作りたい」と思ったとき、スーパーで食材を探すとします。
ここで「野菜売り場」に行ってから「肉売り場」に行くのと、「肉売り場」に行ってから「野菜売り場」に行くのでは、どちらが効率的でしょうか?

実は、「どれくらい種類がバラバラか(カーディナリティといいます)」という視点が重要なんです。

  • 野菜: 玉ねぎ、人参、じゃがいも、ピーマン…(種類が多い!)
  • 肉: 牛、豚、鶏…(種類が少ない!)

もし、「肉」から先に探すと、まず「牛」のコーナーに行きますよね。でも、牛のコーナーにはカレー用の肉もあれば、焼肉用の肉も混ざっています。結局、そこから「野菜」を探す作業は大変です。

逆に、種類がたくさんある「野菜」から先に絞り込んでから肉を探したほうが、ピンポイントで目当ての材料にたどり着けますよね。

複合インデックスを設計するときのコツ

データベースもこれと同じです。

  • まずは「種類が豊富な列(絞り込みが強い列)」を先頭にする
  • 次に「検索でよく使う条件」を並べる

この「順序」を間違えてしまうと、せっかくインデックスを作ったのにデータベースが「うーん、この順番じゃ探しにくいな…」と困ってしまい、結局全部のデータを力技で探すことになってしまいます。

—

まとめ:魔法の杖ではないけれど、強力な相棒

複合インデックスは、あなたのデータベースを劇的に速くしてくれる魔法の杖です。でも、「とりあえず全部の列をインデックスに入れちゃえ!」と欲張るのは禁物です。

インデックスは、データが増えるたびに一生懸命「整理整頓」をしなければならないので、多すぎると逆に更新作業が遅くなってしまうというデメリットもあるんです。

「よく検索される組み合わせはどれかな?」
「どの条件で絞り込むと、データが一番綺麗に分かれるかな?」

そんな風に、データの気持ちになって考えてあげると、きっと素敵なインデックス設計ができるはずですよ。

もしデータベースの挙動で悩んだら、いつでもまた聞きに来てくださいね。あなたのコードが軽快に動くことを、心から応援しています!

コメント

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