データベースの「裏技」、インデックス・オンリー・スキャンって知ってる?
こんにちは!日々のデータベース運用、お疲れ様です。
「クエリが遅い!」という悩み、エンジニアなら一度は通る道ですよね。今日は、そんな悩みを解決する魔法のようなテクニック、「インデックス・オンリー・スキャン」についてお話ししようと思います。
難しい理論は一旦置いておいて、まずは身近な例えから入っていきましょうか。
図書館の「索引」を想像してみてください
例えば、あなたが図書館で「100年前のレシピ本」を探しているとします。
普通なら、図書館の巨大な本棚を端から端まで歩いて、目当ての本を抜き出し、中身をパラパラとめくってレシピを探しますよね。これ、データベースでいうところの「テーブルスキャン」にあたります。時間がかかるし、疲れます。
そこで便利なのが「索引(インデックス)」です。巻末の索引を見て「100年前のレシピは、45ページにあるぞ!」とわかれば、直接そのページへ飛べますよね。これが通常の「インデックス・スキャン」です。
でも、もしあなたが探している情報が「索引に全部書いてあったら」どうでしょう?
「100年前のレシピは○○だ」と索引にメモがあれば、わざわざ本棚まで重い本を取りに行かなくても、その場で解決しちゃいますよね。
これが「インデックス・オンリー・スキャン」です。本棚(テーブル)に一切触れることなく、索引(インデックス)だけで用が足りる。これって、めちゃくちゃ速そうじゃないですか?
PostgreSQLの「Visibility Map」という秘密のメモ
さて、ここから少しだけPostgreSQLの裏側の話をしますね。
PostgreSQLは、実はとても慎重な性格です。たとえインデックスに答えが書いてあったとしても、「このデータ、まだ有効かな?誰かが書き換えてないかな?」と確認するために、念のために本体(テーブル)を見に行こうとする習性があるんです。
しかし、毎回確認に行くのはもったいない。そこで登場するのが「Visibility Map(可視化マップ)」という小さな地図です。
- Visibility Mapとは: 「このページにあるデータは、誰から見ても最新で確定しているよ!」という情報を記した、いわば「お墨付きリスト」のようなもの。
PostgreSQLはこの地図を見て、「お、このページのデータはみんなから見ても間違いなく最新だな。じゃあわざわざ本体を見に行かなくても、インデックスの情報だけで答えていいや!」と判断します。
この仕組みがあるおかげで、私たちは爆速のレスポンスを手に入れることができるんです。
どうすればこの「魔法」を使えるの?
インデックス・オンリー・スキャンを効かせるためのコツは、いたってシンプルです。
1. 必要な列だけをSELECTする:
`SELECT ` をやってしまうと、結局テーブル本体を見に行かないといけません。「必要な列だけ」を指定する癖をつけるだけで、インデックスだけで完結する可能性がグッと高まります。
2. インデックスを味方につける:
検索条件だけでなく、取り出したいデータも含めてインデックスに含めてしまう(カバリングインデックスといいます)のも強力な手段です。
3. VACUUMをサボらない:
Visibility Mapは、PostgreSQLの「お掃除係」であるVACUUMが更新してくれます。データベースが健康でないと、このマップも最新になりません。
最後に
インデックス・オンリー・スキャンは、データベースのパフォーマンスを劇的に改善してくれる「隠し味」のようなものです。
「なぜこのクエリは速いのか?」「なぜあっちのクエリは遅いのか?」
そんな風に、データベースの裏側にある「地図」や「索引」の仕組みを想像しながらクエリを書いてみると、開発がもっと面白くなってくるはずですよ。
もし今、あなたのクエリが少し重いなと感じたら、ぜひ「このデータ、インデックスだけで答えられないかな?」と考えてみてください。
それでは、また次回の記事でお会いしましょう!
コメント