こんにちは!データベースの世界へようこそ。
普段、私たちがデータベースを扱っていると、「検索が遅いな……」と感じる瞬間がありますよね。そんなとき、エンジニアは「インデックス(索引)」という魔法の杖を使います。
でも、実はその魔法、もっと賢く使えることを知っていましたか?
今日は、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があなたに「近道を見つけたよ!」と教えてくれている合図です。
ぜひ、皆さんのシステムでも試してみてくださいね。それでは、また次回の記事でお会いしましょう!
コメント