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

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

普段、何気なく使っているデータベースですが、「もっと速く結果を返してほしいな」なんて思ったことはありませんか?今日は、PostgreSQLを劇的に高速化する魔法のようなテクニック、「インデックスオンリースキャン」についてお話しします。

専門用語ばかりで頭が痛くなりそうな話はナシにしましょう。まずは、身近な例えから入りますね。

—

図書館で「あの本」を探すとき

想像してみてください。あなたは今、巨大な図書館にいます。目的は「ある特定のタイトルの本」を見つけること。

方法1:全検索(テーブルスキャン)

一番原始的な方法は、図書館の端から端まで歩いて、すべての本棚を一つずつチェックすることです。これは……正直、気が遠くなりますよね?データベースの世界でも、これは「テーブルスキャン」と呼ばれていて、データ量が増えるほど絶望的に時間がかかります。

方法2:索引(インデックス)を使う

そこで登場するのが「索引(インデックス)」です。図書館の入り口にある「タイトル順のカード目録」を見れば、目的の本が「どの棚の、どの段にあるか」が一瞬でわかります。これを使うだけで、探索時間は数分の一、いえ、数百分の一になりますよね。

—

そして「インデックスオンリースキャン」へ

さて、ここからが本題です。

先ほどの図書館の例で、もしあなたの目的が「その本がどこにあるか知る」ことではなく、「カード目録に書いてある『出版年』だけを知りたい」という場合だったらどうでしょう?

わざわざ重い本を棚から取り出して中身を確認しに行かなくても、入り口の「カード目録」に「出版年」まで書いてあれば、その場で用事が済みますよね?

これが「インデックスオンリースキャン」です。

データベースは、本来なら「インデックスで場所を特定(1回目)」→「テーブル本体を開いて中身を確認(2回目)」という2段階のステップを踏みます。しかし、「知りたい情報がすべてインデックスの中に載っている」なら、わざわざ本体(テーブル)を見に行く必要はありません。

インデックスだけを見てサクッと回答を返す。これが、データベースにとっての「爆速」の秘訣なんです。

—

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

「じゃあ、どうすればインデックスオンリースキャンをしてくれるの?」という疑問が浮かぶはずです。いくつかポイントを挙げておきますね。

  • 必要な列だけをSELECTする: 「SELECT (全部ください)」ではなく、「SELECT 名前, 年齢」のように必要な列だけを指定しましょう。これだけで、インデックスだけで完結する可能性がグッと上がります。
  • INCLUDE句を活用する: PostgreSQLには、インデックスに特定の列のデータを「おまけ」として持たせておく機能(INCLUDE)があります。これを使うと、「検索には使わないけど、結果として表示したいデータ」をインデックスの中に含めることができ、インデックスオンリースキャンの成功率が跳ね上がります。

—

まとめ:データベースと仲良くなろう

インデックスオンリースキャンは、いわば「手ぶらで帰れる近道」です。

データベースがわざわざ重いデータテーブルを読みに行かなくて済むように、「目録」を工夫してあげる。そうすることで、システム全体が驚くほど軽やかに動くようになります。

難しく考えすぎず、「データベースに余計な仕事をさせない」という意識を持つだけで、あなたはもう立派なパフォーマンス・チューナーの第一歩を踏み出していますよ。

もし、「自分のクエリはどうなってるんだろう?」と気になったら、`EXPLAIN ANALYZE` というコマンドを試してみてください。PostgreSQLが「私は今、インデックスだけで完結できたよ!」と教えてくれるはずです。

それでは、また次回のブログでお会いしましょう。ハッピー・チューニング!

コメント

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