こんにちは!データベースの世界へようこそ。
日々PostgreSQLと向き合っていると、「あれ、なんか最近データベースの反応が鈍い気がするな…」なんて悩むこと、ありますよね。そんなとき、多くの人が真っ先に疑うのが「インデックス」です。
「インデックスをたくさん作れば、検索は爆速になるはず!」
そう思ってインデックスを増やし続けた結果、逆にデータベースが重くなってしまう……。これ、実は現場でよくある「インデックスの罠」なんです。
今日は、そんなインデックスの断捨離に役立つ、魔法のツール『pg_stat_user_indexes』についてお話ししますね。
—
インデックスは「本の手がかり」だけど…
そもそもインデックスって、本で言うところの「索引」みたいなものですよね。巻末に「あ」から始まる言葉がどこにあるか書いてあれば、ページをめくる時間が短縮されます。
でも、想像してみてください。もし、その本に「章ごとの索引」「単語ごとの索引」「登場人物の索引」「日付の索引」……と、何十種類もの索引が付いていたらどうでしょう?
本を開くたびに、「どの索引を最初に見ようかな?」と迷ってしまいますよね。しかも、新しいページを追加するたびに、全ての索引を更新しなきゃいけません。これだと、本を読むスピードよりも、索引を書き換える時間の方が長くなって、結局本を読み終わるのが遅くなってしまいます。
データベースもこれと全く同じなんです。「使われていないインデックス」は、検索の邪魔をするだけの「お荷物」になってしまうんですよ。
—
`pg_stat_user_indexes` で「健康診断」をしよう
そこで登場するのが、PostgreSQLが標準で用意してくれている `pg_stat_user_indexes` というビューです。これは、いわば「インデックスの利用状況カルテ」のようなもの。
これを使えば、「どのインデックスが実際に活躍していて、どれが全く役に立っていないのか」が一目でわかります。
使い方はとっても簡単。PostgreSQLのコンソールで、こんな風に叩いてみてください。
SELECT relname, indexrelname, idx_scan
FROM pg_stat_user_indexes;
これだけで、テーブル名とインデックス名、そして「そのインデックスが何回使われたか(idx_scan)」のリストが出てきます。
ここをチェックして!
このリストを見たときに、`idx_scan` の数字が「0」や、極端に小さいインデックスはありませんか?
- 0回の場合:そのインデックスは、誰にも見向きもされていません。思い切って削除を検討しましょう!
- 数が少ない場合:そのインデックスは、たまにしか使われません。それが「本当に必要な検索」であれば残すべきですが、もし不要なものなら消したほうがデータベースは喜びます。
—
焦って消すのはNG!「まずは観察」から
ここで一つだけ注意点を。さっきの数字が「0」だったからといって、今すぐ削除ボタンを押すのはちょっと待ってください!
データベースの世界には、「月に一度の集計処理」や「年に一度の棚卸し処理」など、たまにしか走らないけれど、その時は絶対にインデックスがないと終わらない……という処理が存在します。
なので、まずはこんな風に考えてみてください。
1. まずは「数週間」様子を見る:稼働中のシステムなら、最低でも1ヶ月くらいはデータを集めてみましょう。
2. 「本当に消していいか」を考える:開発メンバーや、そのテーブルを使うアプリケーションの担当者に「これ消しても大丈夫?」と一言聞いてみるのが一番確実です。
3. バックアップをとって削除:いざ消すときは、インデックスを作るためのSQL文をメモしておいて、いつでも元に戻せるようにしてから実行しましょう。
—
まとめ:身軽なデータベースは速い!
データベースのチューニングって、何かを「足す」ことばかり考えがちですが、実は「不要なものを削る」作業の方が、劇的にパフォーマンスを改善してくれることが多いんです。
`pg_stat_user_indexes` を使って、定期的にデータベースの健康診断をする習慣をつけると、システムは驚くほど軽快に動いてくれるようになりますよ。
「このインデックス、本当に必要かな?」
そうやってデータベースに優しく接してあげると、きっとあなたのシステムも、サクサクとした快適なレスポンスで応えてくれるはずです。ぜひ、今日のお仕事の合間にでも試してみてくださいね!
それでは、また次回の記事でお会いしましょう!
コメント