【入門編】 Index-Only Scansの条件 – PostgreSQL

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

今日は、PostgreSQLのパフォーマンスチューニングにおける「魔法のテクニック」、Index-Only Scan(インデックスのみのスキャン)についてお話しします。

「インデックスを貼れば速くなる」というのは、DBの世界では常識ですよね。でも、実はそのインデックスを「どう使うか」で、スピードは劇的に変わるんです。今日は、まるで近道を知っているプロのような、賢いデータの探し方について解説しますね。

—

図書館で「本の中身」を読まずに済ませる方法

想像してみてください。あなたは巨大な図書館で、ある特定の情報が必要になったとします。

1. 通常のスキャン: 本棚にある本(テーブル)を手に取り、ページをめくって中身を読みます。
2. インデックス・スキャン: まず「索引(インデックス)」を見て、目的のキーワードがどの本にあるか調べます。その後、本棚に行ってその本を手に取り、中身を確認します。

これ、普通は「索引→本」の順番で動きますよね。でも、もし「索引に書いてある情報だけで、知りたいことが全て完結したら」どうでしょうか?

わざわざ重い本を取りに行かなくて済みますよね。これが、データベースにおける「Index-Only Scan」です。

なぜ「インデックスだけ」で完結させる必要があるの?

データベースにとって、インデックス(索引)はとてもスリムでコンパクトです。でも、データ本体が入っている「テーブル(本)」は、何万件、何百万件というデータが詰まった巨大な塊です。

テーブルまで見に行こうとすると、ディスク(本棚)をあちこち探す必要があり、これが意外と時間がかかるんです。だから、インデックスだけで答えが出せるなら、それが一番の近道になるわけです。

それを実現するための「たった一つの条件」

実は、Index-Only Scanを使うには、一つだけ大事なルールがあります。

「欲しい情報が、すべてインデックスの中に含まれていること」

例えば、「ユーザー名」で検索して「ユーザー名」だけを知りたい場合、インデックスに「ユーザー名」が含まれていれば、わざわざテーブルを見に行く必要はありませんよね。

でも、もしインデックスに「名前」しか入っていないのに「年齢」も知りたかったら? 結局、本の中身(年齢が書いてある場所)を見に行くしかありません。これを避けるために、「Covering Index(必要な情報をすべてインデックスに詰め込む手法)」という設計を行うことがあります。

忘れてはいけない「Visibility Map」という名の「付箋」

さて、ここからが少しだけプロっぽい話です。PostgreSQLには「Visibility Map(可視性マップ)」という秘密の機能があります。

これは、インデックスの中に「このページ(データ)は、もう誰からも変更されていないし、誰が見ても最新の状態だよ」ということが書かれた、いわば「付箋」のようなものです。

PostgreSQLは、クエリを実行するときにこの付箋を見ます。

  • 「お、このデータは最新だと確定しているな。じゃあ、わざわざテーブル本体を確認しに行かなくても、インデックスの情報を信じて返してしまおう!」

この判断ができるからこそ、Index-Only Scanが成立するんです。もしこの付箋が貼られていなければ、念のため「本当に最新かな?」とテーブル本体まで確認しに行ってしまう(=Index Scanになってしまう)わけですね。

まとめ:賢くデータと付き合うために

Index-Only Scanを使いこなすコツをまとめると、こんな感じです。

  • よく使う検索条件をインデックスにする: これは基本ですね。
  • 「必要な列」をインデックスに含める: 検索だけでなく、抽出するデータもインデックスに持たせると、爆速になります。
  • バックグラウンドの作業を大切に: PostgreSQLが「これは最新データだ!」と判断できる状態(バキューム処理など)を維持することも、実はとても大事です。

データベースの設計は、まるで整理整頓に似ています。「どこに何があるか」をインデックスという小さなメモ帳にまとめておくことで、本棚をひっくり返す手間を減らす。そう考えると、なんだか愛着が湧きませんか?

ぜひ皆さんのデータベースでも、`EXPLAIN` コマンドを使って、ちゃんと「Index Only Scan」が動いているか覗いてみてくださいね。きっと、今までとは違う景色が見えてくるはずですよ!

それでは、また次回の記事でお会いしましょう!

コメント

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