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

「全部」を頑張らなくていい。PostgreSQLの「部分インデックス」でデータベースを身軽にしよう

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

今日は、PostgreSQLのちょっと賢い機能、「部分インデックス(Partial Indexes)」についてお話しします。

データベースを触り始めたばかりの頃、「とりあえずテーブルを作って、検索によく使うカラムにインデックスを貼っておけばOK!」なんて思っていませんか?もちろん最初はそれで十分なんですが、データが増えてくると、なんだか検索が遅くなったり、ディスクの容量を無駄に食ったりして悩むこと、ありますよね。

そんな時、この「部分インデックス」を知っていると、まるで魔法のようにデータベースが軽やかになるんです。難しいことは抜きにして、日常の例えで見ていきましょう!

—

「図書館の目録」で考えてみよう

想像してみてください。あなたは巨大な図書館の司書さんです。
本を探しに来たお客さんのために、「本の一覧リスト(インデックス)」を作るとしましょう。

普通のやり方は、「図書館にある本、すべてをリストに載せる」という方法です。でも、もし図書館に100万冊もの本があったらどうでしょう?リストは分厚くなりすぎて、探すのにも時間がかかりますよね。

ここでちょっと視点を変えてみます。もし、「貸出中」の本だけを探すお客さんが多いなら、「貸出中の本だけをまとめた小さなリスト」を作っておけば、ものすごく早く見つかると思いませんか?

これが「部分インデックス」の考え方です。

「WHERE句」という名のフィルター

PostgreSQLでインデックスを作る時、普通はこんなふうに書きますよね。

CREATE INDEX idx_all_books ON books (status);

でも、部分インデックスは違います。「WHERE」を使って、「これだけやっておいて!」とお願いするんです。

CREATE INDEX idx_borrowed_books ON books (status) WHERE status = ‘borrowed’;

たったこれだけで、PostgreSQLは「あ、このリストは『borrowed(貸出中)』の本だけを載せればいいんだな」と理解してくれます。

部分インデックスの「3つのいいこと」

この方法を採用すると、どんないいことがあるのか。3つのポイントにまとめてみました。

  • インデックスがコンパクトになる

必要な行だけを記録するので、当然リストのサイズが小さくなります。メモリにも乗りやすくなるので、検索速度がグンと上がります。

  • 更新(UPDATE)が速くなる

インデックスは、データが変わるたびに書き換える必要があります。対象が絞られていれば、その分だけデータベースの手間が減り、書き込み処理がスムーズになります。

  • ディスク容量の節約

ストレージは有限です。無駄なインデックスを削ることは、コスト削減にもつながるんですよ。

どんな時に使えばいいの?

日常の業務で言えば、こんなケースで大活躍します。

  • 「未処理」のタスクだけを常にチェックしたい

`WHERE status = ‘pending’` のようにインデックスを貼れば、未処理のタスクが爆速で見つかります。

  • 「削除フラグ」がついている行を除外したい

`WHERE deleted = false` とすれば、生きているデータだけを対象にしたスリムなインデックスが出来上がります。

  • 特定の期間のデータだけ頻繁に使う

`WHERE created_at > ‘2023-01-01’` のようにして、最近のデータにアクセスしやすくするのもアリですね。

最後に:完璧を目指さなくて大丈夫

プログラミングもデータベースも、ついつい「すべてのパターンに対応しなきゃ!」と完璧を目指したくなりますよね。でも、インデックスに関しては、「本当に必要なものだけを、必要な形で用意する」のが一番の近道だったりします。

「全部」を頑張らなくても、大事なところだけを効率よく整理整頓する。この感覚、データベースだけでなく、日々の仕事にも通じるものがあると思いませんか?

ぜひ、皆さんのプロジェクトでも「これ、全部インデックスする必要あるかな?」と一度立ち止まって、部分インデックスを試してみてください。きっと、PostgreSQLが今までよりもちょっとだけ軽やかに、そして頼もしく動いてくれるはずですよ!

それでは、また次回の記事でお会いしましょう!

コメント

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