インデックスの「お片付け」、忘れていませんか?
こんにちは!日々データベースと向き合っていると、ふと「あれ、最近ちょっと動きが鈍いな?」と感じる瞬間がありませんか?
PostgreSQLを使っていると、最初はサクサク動いていたはずなのに、時間が経つにつれて「あれ、検索が遅いぞ……」と悩むことはよくある話です。その原因の多くは、インデックスの肥大化かもしれません。
今日は、インデックスが散らかってしまう仕組みと、その解決策である「インデックスのお片付け(再構築)」について、難しい用語を抜きにしてお話ししますね。
—
インデックスは「辞書の索引」のようなもの
まず、インデックスの役割をイメージしてみましょう。厚い辞書で特定の単語を探すとき、巻末の索引を使いますよね。「あ」の項目はここ、「い」の項目はここ……と整理されているから、私たちはすぐに目的のページにたどり着けるわけです。
データベースのインデックスも全く同じです。データという名の「辞書」を素早く引くための「整理棚」なんです。
でも、毎日データを出し入れ(更新や削除)しているうちに、この整理棚がどんどん散らかっていくとしたら……?
なぜ「散らかる」のか?
PostgreSQLでは、データの更新や削除を行うと、インデックスの棚に「空きスペース」ができてしまいます。
- 新しいデータを書き込むとき、空いたスペースをうまく再利用できればいいのですが、それができないと「棚の端っこ」にどんどん新しい箱を積み上げていくことになります。
- 結果として、「中身はスカスカなのに、場所だけはやたらと取る」という、いわゆる「断片化」が起きてしまうんです。
棚がスカスカだと、必要な情報を探すために無駄に広い棚を走り回らなきゃいけません。これが、検索が遅くなる正体です。
「どれくらい散らかっているか」を見てみよう
では、自分のデータベースがどれくらい散らかっているのか、確認してみましょう。ここで登場するのが、`pgstattuple` という強力な助っ人ツールです。
これはPostgreSQLに標準で備わっている拡張機能で、インデックスの健康診断をしてくれるレントゲンみたいなものだと思ってください。
— まずは拡張機能をインストール(一度だけでOK!)
CREATE EXTENSION IF NOT EXISTS pgstattuple;
— インデックスの健康診断を実行!
SELECT FROM pgstatindex(‘インデックス名’);
このコマンドを打つと、いろいろな数字が出てきます。特に注目してほしいのは以下の項目です。
- `avg_leaf_density`: 簡単に言うと「棚の詰まり具合」です。ここが極端に低い(例えば30%とか)なら、かなりスカスカな状態です。
- `fragmented_space`: 「無駄に使われているスペース」の量です。ここが大きいと、お片付けのしがいがあるというわけです。
いざ、お片付け(再構築)!
「あ、これ散らかってるな」とわかったら、インデックスを一度綺麗に作り直してあげましょう。PostgreSQLには、サービスを止めずにこっそりお片付けできる魔法のコマンドがあります。
REINDEX INDEX CONCURRENTLY インデックス名;
`CONCURRENTLY`(コンカレント)という魔法の言葉をつけるのがポイントです。これをつけると、インデックスを再構築している間も、他の人がデータベースを使える状態を保ってくれます。これなら、運用中のサービスでも安心ですよね。
—
最後に:お片付けの習慣を
インデックスの再構築は、言ってみれば「大掃除」です。毎日やる必要はありませんが、データの入れ替わりが激しいテーブルには、月に一度や四半期に一度など、定期的なメンテナンスのスケジュールを入れておくと安心です。
データベースも人間と同じで、たまに息抜きと整理整頓をしてあげると、また元気に働いてくれますよ。
もし「最近なんとなく重いな?」と感じたら、まずは `pgstattuple` で健康診断から始めてみてください。きっと、あなたのデータベースが「ちょっと整理してよ!」とSOSを出しているかもしれませんよ。
それでは、良いデータベースライフを!
コメント