【入門編】 インデックスオンリースキャン – PostgreSQL

「本棚の目次」だけで答えがわかる?PostgreSQLの魔法「インデックスオンリースキャン」の話

こんにちは!データベースの世界へようこそ。
普段、何気なく使っているデータベースですが、「もっと速く動いてくれたらいいのになぁ」なんて思ったことはありませんか?

今日は、そんなあなたのクエリを爆速にする秘密兵器、「インデックスオンリースキャン(Index Only Scan)」についてお話しします。

専門用語だらけで難しそう?大丈夫です。まずは、図書館を想像してみてください。

—

図書館で「本の中身」を確認するのは大変ですよね?

あなたが図書館で「ある特定の作家の誕生日」を調べたいとします。

1. 普通の方法: 検索カード(インデックス)を見て本棚の場所を探し、本を取り出して、ページをめくって誕生日を確認する。
2. 魔法の方法: 検索カードをめくった瞬間、そこに「誕生日:19XX年X月X日」と直接書いてあるのを見つける。

この「魔法の方法」が、データベースの世界でのインデックスオンリースキャンなんです。

通常、データベースは「インデックス(目次)」を見てから「テーブル(本の中身)」を見に行きます。でも、もしインデックスの中に必要な情報がすべて揃っていたら……わざわざ本棚まで重い本を取りに行く必要なんてありませんよね?

これが、PostgreSQLがやってのける「究極の効率化」なんです。

—

なぜこれが「最強」なのか?

データベースにおいて、一番時間がかかるのは「ディスク(本棚)からデータを読み込むこと」です。インデックスは小さくてメモリに乗りやすいので、ここだけで完結すれば、爆速で結果が返ってきます。

でも、ここで一つの疑問が浮かびますよね。「もし、データが更新されて最新じゃなかったらどうするの?」と。

ここで登場するのが、可視性マップ(Visibility Map)という名脇役です。

可視性マップ=「このページは変更なし!」の付箋

PostgreSQLは、テーブルのページごとに「このデータはもう古い情報がないから、安心してインデックスの情報だけで判断していいよ!」という付箋のようなものを貼っています。

この付箋(可視性マップ)をチェックして、「よし、これなら安心だ」と確認できたときだけ、インデックスオンリースキャンが発動します。まさに、賢い図書館員さんのような気配りですよね。

—

どうすればこの「魔法」を使えるの?

インデックスオンリースキャンを味方につけるには、ちょっとしたコツがあります。

  • 必要なカラムだけをインデックスに含める

「名前」で検索して「名前」だけを取得したいなら、そのインデックスには名前の情報さえあればOK。

  • SELECT文を絞る

「SELECT (全部)」と書くと、どうしても本の中身を確認しにいかないといけません。「SELECT 名前」のように、必要なものだけを指定するのが、実はパフォーマンスアップの近道だったりします。

—

最後に

インデックスオンリースキャンは、データベースが「いかに無駄な動きを省くか」を追求した結果生まれた機能です。

最初から完璧に使いこなそうなんて思わなくて大丈夫。「あ、今このクエリは本棚に行かずに済んでるかな?」と、`EXPLAIN` コマンドで確認してみることから始めてみてください。

「あれ、このクエリ、インデックスだけで完結してるじゃん!」と気づいた瞬間、なんだかちょっと宝物を見つけたようなワクワクした気分になれるはずですよ。

それでは、また次回の記事でお会いしましょう!データベースとの素敵な旅を!

コメント

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