「本棚」で学ぶ、PostgreSQLの複数列インデックスの秘密
こんにちは!データベースの世界へようこそ。
日々PostgreSQLと向き合っていると、「あれ、インデックスを貼ったはずなのに、なんで検索が遅いの?」という壁にぶつかること、ありますよね。
特に「複数列インデックス(複合インデックス)」は、慣れるまではちょっとしたパズルみたいに感じるかもしれません。でも大丈夫。今日は、一番身近な「本棚」を例にして、この仕組みを紐解いていきましょう!
—
1. インデックスは「索引」ではなく「並び順」
まず、皆さんにイメージしてほしいのは、巨大な図書館の整理です。
PostgreSQLのインデックスは、単なるメモ帳ではなく、「データがそのルール通りに物理的に並んでいる状態」だと思ってください。
例えば、あるテーブルに「名字」と「名前」の列があるとします。ここに `(名字, 名前)` という複数列インデックスを作ると、本棚にはこんな順番で本が並ぶことになります。
- 佐藤・愛
- 佐藤・健一
- 鈴木・一郎
- 鈴木・花子
これ、なんとなく法則が見えてきませんか?
—
2. 「左端一致の原則」という名のルール
ここで非常に重要なのが、「左側から順番に絞り込んでいく」というルールです。これを専門用語で「左端一致」と呼びますが、要は「大きなカテゴリーから先に決めてね」ということです。
なぜ左からじゃないとダメなの?
想像してみてください。あなたが「名前」だけを頼りに特定の誰かを探そうとしたとき、この本棚はどう役に立つでしょう?
「名前が『一郎』の人を探して!」と言われても、この本棚は「名字」順に並んでいるので、一郎さんが「佐藤」さんなのか「鈴木」さんなのか分からないと、最初から最後まで全部の棚をチェックしないといけませんよね。これじゃあ、インデックスの意味がありません。
でも、「名字が『鈴木』で、名前が『一郎』の人」ならどうでしょう?
1. まず「鈴木」のエリアに直行する。
2. その中から「一郎」さんを探す。
これなら、一瞬で目的の本にたどり着けますよね。これが、「左端(名字)から指定すること」の魔法なんです。
—
3. 列の「並び順」で戦略が変わる
複数列インデックスを作るとき、どの列を左にするかは、普段どんな検索をすることが多いかで決まります。
- 名字で検索することが多いなら: `(名字, 名前)`
- 名前で検索することが多いなら: `(名前, 名字)`
もし、インデックスを `(名字, 名前)` で作ってしまった後に、「名前だけで検索したい!」という要望が爆発的に増えたら……残念ながら、そのインデックスはあまり役に立たなくなってしまいます。
だからこそ、設計するときは「一番よく検索条件に使う列を一番左に持ってくる」のが、データベースエンジニアとしての腕の見せ所なんですよ。
—
今日のまとめ:インデックスを設計するヒント
初心者の方がまず押さえておくべきポイントは、この3つだけ!
- インデックスは「左から」が鉄則!:一番左の列を含まない検索だと、インデックスは無視されがちです。
- 「絞り込み」に使う順に並べる:一番大きなカテゴリー(例:都道府県や名字など)を左側にしましょう。
- 欲張りすぎない:全部の列をインデックスに入れればいいわけではありません。必要な時に、必要な順で。
データベースの設計は、まるで整理整頓と同じです。「次にどんな探し方をするかな?」と想像するだけで、システムは劇的に速くなります。
最初は難しく感じるかもしれませんが、少しずつ「並び順」を意識するだけで、きっとPostgreSQLともっと仲良くなれるはずですよ!
また次回の記事でも、現場で使えるちょっとしたコツをお話ししますね。それでは、楽しいエンジニアライフを!
コメント