「全部」を頑張らなくていい。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が今までよりもちょっとだけ軽やかに、そして頼もしく動いてくれるはずですよ!
それでは、また次回の記事でお会いしましょう!
コメント