【入門編】 インデックスオンリースキャン (Index Only Scans) – PostgreSQL

こんにちは!データベースの世界へようこそ。

普段、私たちがデータベースを操作するとき、「何がどう動いているかなんて、正直あまり意識しませんよね。でも、たまにはエンジンルームを覗いてみると、PostgreSQLがどれほど賢く立ち回っているかが見えてきて、ちょっと愛おしくなったりするものです。

今日は、そんなPostgreSQLの「裏技」の一つ、「インデックスオンリースキャン」についてお話しします。これを知ると、クエリがなぜ速いのか、なぜ「たまにはお掃除(VACUUM)が必要なのか」がスッと理解できるようになりますよ。

—

図書館の本棚と「目次」の魔法

データベースを「巨大な図書館」だと想像してみてください。
データが詰まった本(テーブル)はとっても分厚くて、全部読むには時間がかかります。だから、私たちは「目次(インデックス)」を作って、目的のページへ素早く飛べるようにしますよね。

普通、クエリを投げるとこんなことが起きます。

1. 目次(インデックス)で、「あ、このデータは300ページ目にあるんだな」と場所を確認する。
2. 本(ヒープ)の300ページ目までわざわざ歩いていって、中身を確認する。

これが普通の検索です。でも、もし「知りたい情報が、実は目次に全部書いてあったら」どうでしょう?

わざわざ本棚まで歩いていかなくても、目次だけパッと見て「はい、答えはこれ!」と返せますよね。これが「インデックスオンリースキャン」です。本(ヒープ)を一切開かないから、圧倒的に速いんです。

—

Visibility Map(可視化マップ)という「魔法のしおり」

ここで一つ疑問が浮かびますよね。「目次にはデータがあるけど、そのデータが今も最新のものかどうか、どうやって判断してるの?」と。

PostgreSQLは、ここで「Visibility Map(可視化マップ)」という特別な仕組みを使います。

これは言わば、図書館の司書さんが持っている「この本の中身は、誰からも書き換えられていない最新状態ですよ」という証明書のようなもの。
このマップに「このページは誰にもいじられていないよ!」というお墨付きがあれば、PostgreSQLは迷わず「よし、じゃあ目次だけで完結させよう!」と判断するんです。

—

なぜ「VACUUM(お掃除)」が重要なのか?

さて、ここからが少しだけ大事な話です。

もし誰かが本の内容を書き換えたり、ページを破いたりしたらどうなるでしょう? 目次に書いてある情報と、本の内容がズレてしまうかもしれませんよね。

PostgreSQLでは、古くなったデータを捨てたり整理したりすることを「VACUUM(バキューム)」と呼びます。

  • VACUUMをサボると…

PostgreSQLは「このページ、まだ最新かな?書き換えられてないかな?」と確信が持てなくなります。結果、せっかくの「魔法のしおり(Visibility Map)」が使えなくなり、仕方なくわざわざ本棚まで見に行くことになります。これではインデックスオンリースキャンの恩恵を受けられません。

  • VACUUMが働くと…

「お掃除完了!このエリアは最新情報で確定です!」とVisibility Mapが更新されます。するとPostgreSQLは「よし、また目次だけで答えられるな!」と再び爆速モードに戻るんです。

—

まとめ:データベースと仲良くなるために

インデックスオンリースキャンは、データベースが「できるだけ楽をして、最高の結果を出す」ための工夫です。

  • 「目次だけで答えが完結するようにインデックスを工夫する」
  • 「VACUUMを定期的に動かして、データの鮮度を保つ」

この二つを意識するだけで、あなたの書くクエリは驚くほど軽快に動くようになります。

データベースを単なる「データを保存する箱」として扱うのではなく、「一緒に仕事をするパートナー」だと思ってあげてください。そうすると、彼らもきっと、最高のパフォーマンスで期待に応えてくれるはずですよ。

それでは、また次回のブログでお会いしましょう!あなたのデータベースライフが、もっと快適なものになりますように。

コメント

タイトルとURLをコピーしました