こんにちは!データベースの世界へようこそ。
普段、PostgreSQLを触っていて「なんだかクエリが遅いな……」と悩んだことはありませんか?
実は、データの探し方を少し工夫するだけで、そのイライラが嘘のように解消されることがあります。今日は、データベースの「インデックス(索引)」、特に「複合インデックスの順番」という、エンジニアなら誰もが一度はぶつかる壁についてお話ししますね。
—
本棚で例えると、すべてがわかる
データベースのインデックスを考えるとき、私はよく「図書館の本棚」を想像します。
例えば、「著者名」と「タイトル」が書かれた本が10万冊並んでいるとしましょう。あなたが特定の1冊を探すとき、どうやって探しますか?
- 「著者名」で並べて、その次に「タイトル」で並べる
これなら、まず「著者名」のエリアへ直行して、その中で「タイトル」を探せばいいので、めちゃくちゃ速いですよね。
- 「タイトル」で並べて、その次に「著者名」で並べる
これでも、もちろん速いです。
でも、もし「まずはタイトルで探そう」と決めたのに、本棚が「著者名」順に並んでいたとしたら?
……悲劇ですよね。結局、全部の本棚を端から端まで見て回るハメになります。
これが、データベースで言うところの「インデックスの順番」の重要性なんです。
—
「最左接頭辞ルール」という名の「左側から順に」の法則
PostgreSQLで「複合インデックス(複数の列を組み合わせたインデックス)」を作るとき、一番大切なルールがあります。それが「最左接頭辞(さいさせっとうじ)ルール」というやつです。
名前は難しそうですが、要するに「インデックスは『左から順番に』使われる」という、ただそれだけのルールです。
例えば、`(名字, 名前)` という順番でインデックスを作ったとします。
- 使えるケース:
- 「名字」で検索する(左側が含まれているのでOK!)
- 「名字」と「名前」の両方で検索する(左から順番に揃っているので完璧!)
- 使えない(効率が悪い)ケース:
- 「名前」だけで検索する(左側の「名字」を飛び越して「名前」は探せません)
「名字」を知らないのに、いきなり「名前」から本棚を引こうとしても、データベースは困ってしまうんです。「えっ、どの名字の棚に行けばいいの?」って迷子になっちゃうイメージですね。
—
どうやって順番を決めればいいの?
じゃあ、どの列を左側に持ってくるのが正解なんでしょう?
ここがエンジニアの腕の見せ所です。基本はこれです。
1. 「絞り込みが強い条件」を左側に!
例えば、「年齢」と「性別」なら、「年齢」の方が値の種類が多い(=より細かく絞り込める)ので、年齢を左に置く方が効率的です。
2. 「よく検索する条件」を左側に!
あなたのアプリで一番よく検索される条件は何ですか? その条件が、インデックスの左端に来るように設計しましょう。
—
最後に:完璧を目指しすぎないで
初心者の頃は、「どの順番にすれば一番速いんだろう?」と悩みすぎて手が止まってしまうことがあるかもしれません。でも大丈夫。最初から完璧なインデックスを作るのは、ベテランの僕だって難しいんです。
まずは、「よく使う検索条件が、インデックスの左側にきているかな?」と意識するだけで十分です。
PostgreSQLはとても賢いので、もしインデックスがうまく使われていないときは、`EXPLAIN ANALYZE` という魔法の言葉(コマンド)をクエリの先頭につけてみてください。「今、データベースがどうやってデータを探したか」を教えてくれますよ。
データモデリングは、まるで庭いじりのようなもの。少しずつ手入れをして、自分たちのアプリにぴったりの環境を整えていきましょうね。
もし分からないことがあれば、いつでもコメント欄で聞いてください。一緒に解決していきましょう!
コメント