【入門編】 Index Only ScanとVisibility Map – PostgreSQL

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

普段、私たちがデータベースを扱っていると、「検索が遅いな……」と感じる瞬間がありますよね。そんなとき、エンジニアは「インデックス(索引)」という魔法の杖を使います。

でも、実はその魔法、もっと賢く使えることを知っていましたか?
今日は、PostgreSQLが誇る最強の時短テクニック、「Index Only Scan(インデックス・オンリー・スキャン)」について、少しお話しさせてください。

—

本棚と「メモ帳」の話

想像してみてください。あなたは巨大な図書館の司書さんです。
お客さんから「この本はどこにある?」と聞かれたら、まずは「索引(インデックス)」を見て、本の場所を確認しますよね。

でも、もしお客さんが「この本、まだ貸し出し中かな?」とか「この本、在庫はある?」という、「本の中身を見なくても答えられること」を聞いてきたとしたらどうでしょう?

わざわざ重い本棚まで歩いて行って、本を手に取って確認する必要なんてありませんよね。索引に「貸出中」というメモが書いてあれば、その場で「あ、今出てますよ!」と答えられるはず。

これが、Index Only Scanの正体なんです。

—

Visibility Map:その本は「誰にも触られていない」という証明

さて、ここで少しだけPostgreSQLの舞台裏の話をします。

PostgreSQLは、データが更新されると古いデータと新しいデータが混在してしまう特性があります。「今、このデータは最新なのか?」を確認するために、通常はわざわざ本体データ(テーブル)まで見に行かないといけないんです。これが時間がかかる原因の一つ。

でも、PostgreSQLには「Visibility Map(可視性マップ)」という、とっても優秀な事務員さんがいます。

この事務員さんは、常にこうチェックしています。
「このページにあるデータは、誰からも書き換えられていないし、みんなが最新の状態を見られる状態ですよ!」

もし、この事務員さんが「このページは誰にも触られていないよ(Visibility Mapにフラグが立っている)」と教えてくれたら、PostgreSQLは確信します。
「よし!わざわざ本体を見に行かなくても、インデックスの情報だけで答えを出しても大丈夫だ!」と。

これが、Visibility Mapを使った高速化の仕組みです。

—

どうすればこの恩恵を受けられるの?

では、どうすればこの「爆速」の恩恵を受けられるのでしょうか。難しい設定は必要ありません。ただ、クエリを書くときに少しだけ意識してみてください。

  • 「SELECT 」を卒業しよう

必要な列だけを指定しましょう。インデックスに含まれている列だけで答えが出せれば、PostgreSQLは迷わずIndex Only Scanを選んでくれます。

  • インデックスを賢く作ろう

よく検索に使う列をインデックスに含めるのは基本ですが、もし「いつも特定の列とセットで検索する」なら、その列もインデックスに巻き込んでしまう(INCLUDE句を使うなど)のも一つの手です。

—

最後に:データベースとの付き合い方

データベースのチューニングって、なんだか難しそうに聞こえますよね。でも、こうやって「どうやって無駄を省くか」「どうすれば近道できるか」を考えるのは、まるでパズルを解くようで面白いものですよ。

PostgreSQLという相棒は、私たちが少しのヒントをあげるだけで、驚くようなスピードで結果を返してくれるポテンシャルを持っています。

まずは、皆さんの書いているクエリを「EXPLAIN」というコマンドで覗いてみてください。そこに「Index Only Scan」という文字を見つけたら、それはPostgreSQLがあなたに「近道を見つけたよ!」と教えてくれている合図です。

ぜひ、皆さんのシステムでも試してみてくださいね。それでは、また次回の記事でお会いしましょう!

コメント

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