こんにちは!データベースの世界へようこそ。
PostgreSQLを触り始めると、必ずと言っていいほど直面するのが「インデックス」という壁です。本やドキュメントを読むと「複合インデックスの設計が大事!」なんて書いてありますが、正直、ピンとこないこともありますよね。
今日は、そんなインデックスの「順序」の話を、ちょっと日常的な例えで紐解いてみましょう。
—
インデックスは「辞書」だと思ってください
そもそもインデックスって何でしょう? 難しく考えず、「分厚い辞書」をイメージしてください。
もしあなたが「りんご」という単語を調べたいとき、辞書の最初から1ページずつめくりますか? しませんよね。「り」のコーナーをパッと開いて、そこから探すはずです。これがインデックスの役割です。
では、もし「赤い」「果物」という2つの条件で何かを探したいとき、どう並べたら一番効率的だと思いますか?
—
複合インデックスの「並び順」が重要な理由
例えば、あなたが巨大な図書館の司書さんだとします。本棚を整理するとき、「ジャンル」と「著者名」の2つを使ってインデックス(目録)を作るとしましょう。
パターンA:「ジャンル」→「著者名」の順で並べる
本棚に、まず「料理」コーナーがあり、その中で「著者名」のあいうえお順に並んでいる状態です。
- 「料理の本で、山田さんの本を探して」と言われたら? → 「料理」のコーナーに直行して、「山田さん」を探すだけ。爆速ですね!
- 「とりあえず山田さんの本を見せて」と言われたら? → ジャンルがバラバラなので、図書館全体を走り回る必要があります。ちょっと大変そう。
パターンB:「著者名」→「ジャンル」の順で並べる
こちらは、まず「あいうえお順」に全著者が並んでいて、同じ著者の本の中で「ジャンル」が分かれている状態です。
- 「とりあえず山田さんの本を見せて」と言われたら? → 「山田さん」のエリアに直行すればいいので、これも爆速です。
—
「左端一致の原則」という名のルール
ここで大事なのが、「最初に何で並べるか(左端の列)」です。
PostgreSQLの世界では、これを「左端一致の原則」と呼んだりします。要は「インデックスの左側に書いた条件を無視して、右側の条件だけで検索しようとしても、インデックスは役に立たないよ」というルールなんです。
さっきの図書館の例で言うと、「ジャンル」を無視して「著者名」だけで探そうとすると、せっかく作った「ジャンル順」の並びが全く活かせない、という状態ですね。
初学者が陥りやすい罠
よくある失敗が、「検索で使うカラムを全部インデックスに入れればいいんでしょ?」と、何も考えずに詰め込んでしまうこと。
1. 左側にくるカラムは、一番よく使う条件にする
(例:日付やユーザーIDなど、絞り込みの強さが高いもの)
2. 全部に入れれば速くなるわけじゃない
(インデックスもデータなので、多すぎると更新が重くなります)
—
まとめ:設計のヒント
最後に、明日からの設計に使える「コツ」をまとめておきますね。
- 「一番よく検索する条件」を左側に置く:
「WHERE句」で必ず書くような条件を左端にしましょう。これが検索の入り口になります。
- 「絞り込みの範囲が狭いもの」を優先する:
値の種類が多い(=検索結果が少なくて済む)ものを先に並べると、効率がグンと上がります。
- まずはシンプルに:
最初から複雑な複合インデックスを作ろうとせず、「これとこれはいつもセットで検索するな」というペアを見つけることから始めてみてください。
データベースの設計って、料理のレシピに似ているかもしれません。最初から完璧な構成なんてなくて、実際に動かしてみながら「あ、ここはもう少しこう並べたほうが速いな」と調整していくのが、一番の上達への近道ですよ。
もし「自分のテーブル設計、これでいいのかな?」と迷ったら、いつでもまた聞きに来てくださいね。一緒に考えていきましょう!
コメント