【入門編】 部分インデックス (Partial Indexes) – PostgreSQL

こんにちは!データベースの世界へようこそ。

普段、何気なく使っているデータベースですが、データが数百万、数千万件と増えてくると、どうしても「検索が遅いな……」と感じる瞬間がやってきますよね。そんなとき、多くの人が真っ先に思いつくのが「インデックス(索引)」です。

でも、ちょっと待ってください。インデックスは魔法の杖ではありません。作りすぎると今度は「データの更新が遅くなる」という副作用が出てしまいます。

そこで今日は、そんな悩みをスマートに解決する、PostgreSQLの「隠し玉」のような機能、「部分インデックス(Partial Index)」についてお話ししようと思います。

—

インデックスは「本の内容」じゃない、「索引」なんです

まず、インデックスのイメージを共有しましょう。
分厚い専門書を想像してみてください。巻末に「索引(さくいん)」がありますよね。「あ行」「か行」……と並んでいるあれです。

データベースのインデックスも全く同じ役割です。データ全体をいちいちめくって探すのは大変だから、重要なキーワードだけを抜き出して「ここにあるよ!」と地図を作っておくんです。

でも、もしその本が1万ページあったらどうでしょう? 索引を作るだけでも膨大な時間がかかりますし、その索引自体が分厚すぎて邪魔になりますよね。

「全部」じゃなくて「必要なところ」だけでいいんじゃない?

ここで登場するのが「部分インデックス」です。

例えば、あるECサイトの注文履歴テーブルがあるとします。そこには「完了した注文」と、まだ処理中の「キャンセル待ち(未完了)の注文」が混ざっていますよね。
実際、業務で頻繁に検索されるのは「未完了の注文だけ」だったりしませんか?

「完了した注文」は過去の遺産としてデータは残しているけれど、検索はほとんどしない。それなのに、全件分インデックスを作ってしまうのは、ちょっともったいないと思いませんか?

「未完了の注文だけ」を対象にしてインデックスを作る。
これが部分インデックスの考え方です。

部分インデックスのすごいところ

部分インデックスを使うと、こんな嬉しいことが待っています。

  • インデックスがめちゃくちゃ軽くなる

対象を絞り込むので、インデックスのサイズが劇的に小さくなります。ストレージの節約にもなりますし、メモリにも乗りやすくなるので、結果として検索も爆速になります。

  • 更新が速くなる

インデックスはデータが書き込まれるたびに更新されます。インデックスが小さければ、その更新の手間も減る。つまり、システム全体の負荷が下がるんです。

実際に書いてみましょう

PostgreSQLでの書き方はとってもシンプルです。普通のインデックス作成の最後に、ちょこっと `WHERE` を足すだけ。

— 普通のインデックス(全件対象)
CREATE INDEX idx_all_orders ON orders(order_date);

— 部分インデックス(未完了の注文だけ!)
CREATE INDEX idx_pending_orders ON orders(order_date)
WHERE status = ‘pending’;

これだけで、データベースは「お、未完了の注文を探すときだけこのリストを使えばいいんだな」と理解してくれます。賢いですよね。

—

まとめ:身軽な設計が、システムの寿命を延ばす

初心者の方こそ、最初から「全部にインデックスを貼ればいいや」と考えがちですが、実は「必要なものだけを、必要なだけ貼る」という引き算の美学こそが、熟練エンジニアへの第一歩なんです。

部分インデックスは、まさにその「引き算」を可能にする強力な武器です。

「本当に全件インデックスが必要かな?」
「このデータ、検索するときはいつも条件が決まってないかな?」

そうやってデータと向き合う癖をつけると、あなたの作るデータベースは驚くほど軽やかで、長く愛されるシステムになるはずです。

ぜひ、次の設計で試してみてくださいね。応援しています!

コメント

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