【入門編】 複合インデックス – PostgreSQL

こんにちは!データベースの世界へようこそ。
普段、PostgreSQLを触っていて「なんだかクエリが遅いな……」と悩んだことはありませんか?

実は、データの探し方を少し工夫するだけで、そのイライラが嘘のように解消されることがあります。今日は、データベースの「インデックス(索引)」、特に「複合インデックスの順番」という、エンジニアなら誰もが一度はぶつかる壁についてお話ししますね。

—

本棚で例えると、すべてがわかる

データベースのインデックスを考えるとき、私はよく「図書館の本棚」を想像します。

例えば、「著者名」と「タイトル」が書かれた本が10万冊並んでいるとしましょう。あなたが特定の1冊を探すとき、どうやって探しますか?

  • 「著者名」で並べて、その次に「タイトル」で並べる

これなら、まず「著者名」のエリアへ直行して、その中で「タイトル」を探せばいいので、めちゃくちゃ速いですよね。

  • 「タイトル」で並べて、その次に「著者名」で並べる

これでも、もちろん速いです。

でも、もし「まずはタイトルで探そう」と決めたのに、本棚が「著者名」順に並んでいたとしたら?
……悲劇ですよね。結局、全部の本棚を端から端まで見て回るハメになります。

これが、データベースで言うところの「インデックスの順番」の重要性なんです。

—

「最左接頭辞ルール」という名の「左側から順に」の法則

PostgreSQLで「複合インデックス(複数の列を組み合わせたインデックス)」を作るとき、一番大切なルールがあります。それが「最左接頭辞(さいさせっとうじ)ルール」というやつです。

名前は難しそうですが、要するに「インデックスは『左から順番に』使われる」という、ただそれだけのルールです。

例えば、`(名字, 名前)` という順番でインデックスを作ったとします。

  • 使えるケース:
  • 「名字」で検索する(左側が含まれているのでOK!)
  • 「名字」と「名前」の両方で検索する(左から順番に揃っているので完璧!)
  • 使えない(効率が悪い)ケース:
  • 「名前」だけで検索する(左側の「名字」を飛び越して「名前」は探せません)

「名字」を知らないのに、いきなり「名前」から本棚を引こうとしても、データベースは困ってしまうんです。「えっ、どの名字の棚に行けばいいの?」って迷子になっちゃうイメージですね。

—

どうやって順番を決めればいいの?

じゃあ、どの列を左側に持ってくるのが正解なんでしょう?
ここがエンジニアの腕の見せ所です。基本はこれです。

1. 「絞り込みが強い条件」を左側に!
例えば、「年齢」と「性別」なら、「年齢」の方が値の種類が多い(=より細かく絞り込める)ので、年齢を左に置く方が効率的です。
2. 「よく検索する条件」を左側に!
あなたのアプリで一番よく検索される条件は何ですか? その条件が、インデックスの左端に来るように設計しましょう。

—

最後に:完璧を目指しすぎないで

初心者の頃は、「どの順番にすれば一番速いんだろう?」と悩みすぎて手が止まってしまうことがあるかもしれません。でも大丈夫。最初から完璧なインデックスを作るのは、ベテランの僕だって難しいんです。

まずは、「よく使う検索条件が、インデックスの左側にきているかな?」と意識するだけで十分です。

PostgreSQLはとても賢いので、もしインデックスがうまく使われていないときは、`EXPLAIN ANALYZE` という魔法の言葉(コマンド)をクエリの先頭につけてみてください。「今、データベースがどうやってデータを探したか」を教えてくれますよ。

データモデリングは、まるで庭いじりのようなもの。少しずつ手入れをして、自分たちのアプリにぴったりの環境を整えていきましょうね。

もし分からないことがあれば、いつでもコメント欄で聞いてください。一緒に解決していきましょう!

コメント

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