「全部」にインデックスを貼るなんて、もったいない!PostgreSQLの「部分インデックス」でスマートに高速化しよう
こんにちは!データベースエンジニアとして日々PostgreSQLと格闘していると、時々「これ、わざわざ全部にインデックスを貼る必要ある?」と立ち止まりたくなる瞬間があります。
皆さんは、図書館や本屋さんに並んでいる膨大な本を想像してみてください。もし、すべての本一冊ずつに「全ページの見出し」が書かれた巨大な索引がついていたら……。本棚が索引だらけになって、肝心の本を置くスペースがなくなってしまいますよね。
データベースの「インデックス」も、実はこれと同じなんです。今日は、そんな「無駄を省いてスマートに速くする」テクニック、部分インデックス(Partial Index)についてお話しします。
—
インデックスって「目次」のようなもの
まずおさらいです。データベースにおけるインデックスは、本の巻末にある「索引」と同じ役割を果たします。これがあるおかげで、私たちは膨大なデータの中から、お目当ての情報を一瞬で見つけ出せるわけです。
でも、インデックスもデータの一部なので、実は結構な「場所(ディスク容量)」を取るんですよね。しかも、新しくデータを書き込むたびに、インデックスも更新しなければならない。これが重なると、データベース全体のパフォーマンスが少しずつ下がってしまうこともあります。
「必要なところだけ」に注目する
そこで登場するのが「部分インデックス」です。
例えば、あなたが「ECサイトの注文管理システム」を作っているとしましょう。データの中には、何万件もの注文データが入っています。その中で、よく検索されるのは「まだ発送されていない注文(ステータスが『未発送』のもの)」だけだとしたらどうでしょうか?
「完了した注文」は過去の記録としてたまに見るだけ。そんな状況なのに、全ての注文にインデックスを貼るのは、少しもったいない気がしませんか?
そんな時、PostgreSQLならこんな風に書けるんです。
CREATE INDEX idx_unshipped_orders
ON orders (order_date)
WHERE status = ‘未発送’;
この「`WHERE`」がポイントです。これによって、「未発送のデータだけを抜き出して、その分だけの目次を作る」ことができるんです。
部分インデックスを使う3つのメリット
なぜ、この「部分」インデックスがエンジニアに愛されているのか。理由はシンプルです。
- インデックスが小さくなる:対象を絞る分、目次がコンパクトになります。ディスクの節約にもなりますね。
- 検索がさらに速くなる:目次が小さければ、データベースが「あ、ここだ!」と見つけるまでの距離も短くなります。
- 更新時の負担が減る:例えば「発送済み」のデータに新しい注文が入っても、このインデックスには関係ないので、余計な更新処理が走りません。
どんな時に使うと幸せになれる?
もちろん、何でもかんでも部分インデックスにすればいいわけではありません。以下のようなケースで特に輝きます。
- 特定のフラグで検索することが多いとき(例:「有効なユーザーだけ検索する」「エラーが発生したログだけ見たい」など)
- データの大部分は検索対象外なとき
- とにかくストレージのコストを抑えたいとき
最後に
データベース設計は、まるで「お部屋の整理整頓」に似ています。何でもかんでも収納箱に放り込むのではなく、「よく使うものは手前に、あまり使わないものは奥に」と工夫するだけで、日々の暮らし(=システムの動作)はぐっと快適になります。
PostgreSQLは、そんな整理整頓の手助けをしてくれる、とても優秀なパートナーです。もし皆さんのデータベースで「ここ、いつも特定の条件でしか検索してないな」という場所があれば、ぜひ「部分インデックス」を試してみてください。
「お、なんだか動きが軽くなったかも?」と実感できた時の喜びは、エンジニア冥利に尽きるものですよ。
それでは、また次回の記事でお会いしましょう!Happy Coding!
コメント