こんにちは!データベースの世界へようこそ。
普段、PostgreSQLを使っていると「クエリが遅いな……」と感じる瞬間、ありますよね。そんな時、インデックス(索引)を貼ることで劇的に速くなる経験をしたことがある方も多いはずです。
でも、インデックスって実は「ただ貼ればいい」というわけではないんです。今日は、PostgreSQLが裏側でこっそりやっている、「Visibility Map(可視性マップ)」という超重要なお仕事について、お話ししようと思います。
専門用語だらけのドキュメントを読む前に、ちょっとだけ肩の力を抜いて読んでみてくださいね。
—
本棚で「本の中身」をいちいち開かなくて済む方法
想像してみてください。あなたは巨大な図書館の司書さんです。
利用者が「この情報が載っている本はどこ?」と聞いてきたとき、あなたは目次や索引を使って本を探しますよね。
でも、もしその本を開いてみたら、中身が書き換えられていて、古い情報ばかりだったとしたらどうでしょう?「ああ、これは古い版だからダメだ」と確認するために、わざわざ本を全部めくって中身をチェックする……。これって、すごく時間がかかりますよね。
PostgreSQLにとって、この「中身を確認する作業」は非常に重い処理なんです。
そこで登場するのが「Visibility Map」
Visibility Mapを一言で言うと、「この本(ページ)の中身は、誰から見ても最新で確定しているよ!」ということを教えてくれる「付箋」のようなものです。
PostgreSQLは、データが記録されているページごとに、「この中のデータは、誰がいつ見ても絶対に正しい(可視である)」という情報を、小さなビット(0か1のスイッチ)で管理しています。
- 付箋がある(ビットが1): 「このページは全員が最新だと知っているから、中身をわざわざ見なくても大丈夫!」
- 付箋がない(ビットが0): 「まだ更新されたばかりかもしれないから、念のため中身を詳しくチェックしよう」
という判断をしているわけです。
—
なぜこれが「インデックスオンリースキャン」を爆速にするのか?
PostgreSQLがデータを検索する際、インデックスだけを見て結果を返す「インデックスオンリースキャン」というテクニックがあります。
通常、インデックスには「どのデータがどこにあるか」という場所は書いてありますが、「そのデータが今、最新か?」という情報は書いてありません。だから、本来はインデックスで場所を特定した後、必ず本体のデータ(ヒープ)まで確認しに行く必要があります。
でも、ここでVisibility Mapの登場です!
「Visibility Mapを見て、付箋が貼ってあれば、わざわざ本体データを見に行かなくていいよね!インデックスだけで答えを出しちゃおう!」
こうして、本来必要な「本体を見に行く」という往復ビンタのような移動をスキップできるので、検索がとてつもなく速くなるんです。これが、インデックスオンリースキャンの魔法の正体です。
—
データベースの裏側にある「効率化」のヒント
Visibility Mapは、バックグラウンドで動いている「VACUUM(バキューム)」というお掃除屋さんが、定期的にチェックして貼り直してくれています。
つまり、データベースが健康で、ちゃんとお掃除されている状態なら、この付箋はどんどん正確になり、あなたのクエリはどんどん速くなる。逆に、お掃除が追いついていないと、付箋がうまく貼れず、PostgreSQLは律儀に本体を確認しに行ってしまう……。
なんだか、人間関係の整理整頓と似ていますよね。
今回のまとめ
- Visibility Mapは「このページは誰からも最新だと分かる」という付箋のようなもの。
- これがあるおかげで、わざわざ本体データを見に行かずに、インデックスだけで検索を完結できる。
- この仕組みが、PostgreSQLを速く保つための重要な鍵になっている。
いかがでしたか?少しだけ、PostgreSQLが裏側で何を考えているのか、イメージが湧いてきたでしょうか。
「データベースが速い理由」を知ると、インデックスを貼る時の意識も少し変わるはずです。ぜひ、今度 `EXPLAIN` コマンドを打つときは、「お、いまVisibility Mapが仕事してくれたかな?」なんて想像しながら眺めてみてくださいね。
それでは、また次回の記事でお会いしましょう!
コメント