みなさん、こんにちは!データベースエンジニアの現場から、今日も現場のリアルな知恵をお届けします。
今日は、PostgreSQLを使っていると必ずと言っていいほどぶつかる「インデックスの悩み」についてお話ししようと思います。
皆さんは、自分のデータベースに「全然使われていないインデックス」が眠っているかも……なんて考えたことはありますか?
インデックスは「本棚のしおり」みたいなもの
データベースにとってインデックスというのは、例えるなら「本棚の目次やしおり」のような存在です。ある特定のページをすぐに見つけるためには欠かせないものですよね。
でも、考えてみてください。もし、本棚のすべてのページに「しおり」が挟まっていたらどうなるでしょう?
新しいページを追加するたびに、その大量のしおりを整理したり、付け直したり……。結果として、本の出し入れがどんどん重くなってしまいますよね。データベースの世界でもこれと同じことが起きます。インデックスは検索を速くしますが、データを追加したり更新したりする作業を少しだけ遅くしてしまうんです。
だからこそ、「本当に使われているインデックスだけを賢く残す」というのが、データベースを軽快に保つための秘訣なんです。
そこで登場するのが「pg_stat_user_indexes」
「じゃあ、どれが使われていて、どれがゴミなのかどうやって見分けるの?」と疑問に思いますよね。そこで頼りになるのが、PostgreSQLが標準で用意してくれている`pg_stat_user_indexes`というビューです。
これは、いわばデータベースの「利用状況レポート」です。
このビューを覗くと、各インデックスが「これまで何回スキャン(検索)に使われたか」というデータが一目瞭然なんです。
使い方はこんなに簡単!
SQLが少し書けるなら、こんな感じで今の状況を覗いてみることができます。
SELECT
relname AS テーブル名,
indexrelname AS インデックス名,
idx_scan AS スキャン回数
FROM
pg_stat_user_indexes
ORDER BY
idx_scan ASC;
これだけで、「あ、このインデックス、一度も検索に使われていないな……」というものがすぐに浮き彫りになります。
未使用インデックスを見つけたらどうする?
もし、「スキャン回数がゼロ」のインデックスを見つけたら、すぐに削除……!といきたいところですが、ちょっと待ってくださいね。
エンジニアとしての大切なアドバイスですが、「回数がゼロだからといって、明日すぐに消していいとは限らない」んです。例えば、年に一度の決算処理でしか使われないような、レアな検索に使われている可能性もありますからね。
まずは、ログをしばらく眺めてみたり、本番環境のデータを消す前に、ステージング環境で外してみたらどうなるか……といった「慎重な観察」が大事です。
最後に
データベースのチューニングと聞くと、なんだか難しそうな呪文を唱えるようなイメージがあるかもしれません。でも、今回紹介した`pg_stat_user_indexes`のように、データベース自身が「私、今はこうなってるよ!」と教えてくれる情報を活用するだけで、誰でも立派なチューニングができるようになります。
お家のクローゼットの整理と同じで、使っていないものを手放すだけで、システムはもっと軽やかに、もっと元気に動いてくれるはずです。
ぜひ皆さんのデータベースでも、一度このビューを覗いてみてくださいね。「えっ、こんなに使われてないインデックスがあったの?」という発見があるかもしれませんよ!
それでは、また次回の記事でお会いしましょう。ハッピーなデータベースライフを!
コメント