【入門編】 B-treeインデックスの最適化と特性 – PostgreSQL

「探す」時間を劇的に減らす!PostgreSQLのB-treeインデックスの秘密

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

皆さんは、分厚い本の中から特定の単語を探すとき、どうしていますか?一ページずつ最初から最後までめくる人は、まずいないはずです。巻末の「索引(インデックス)」を見て、何ページにあるかを確認してから目的のページに飛びますよね。

実は、PostgreSQLの「B-treeインデックス」も、これと全く同じことをしています。今日は、このインデックスがなぜこれほどまでに優秀なのか、そしてどうやって賢く使うとクエリが爆速になるのかを、一緒に紐解いていきましょう。

—

B-treeって、結局なにもの?

B-tree(ビーツリー)は、データベースで最もよく使われるインデックスの形です。イメージとしては「整理整頓された階層構造」です。

例えば、図書館の蔵書管理を想像してみてください。

  • まず「あ〜さ行」「た〜わ行」という大きな看板がある。
  • その次に、「あ行」の中の「あ〜お」という棚がある。
  • 最後に、個別の本が並んでいる。

こうやって枝分かれ(Tree)させて整理されているから、膨大なデータの中からでも、ほんの数ステップで目的のデータにたどり着けるんです。

B-treeが最強な理由

この構造のすごいところは、「等価比較(=)」にも「範囲検索(>や<)」にも強いこと。
「名前が佐藤さん」を探すのも、「売上が100万円から200万円の間」を探すのも、この整理棚をたどれば一瞬です。これが、PostgreSQLでインデックスといえばまずはB-tree、と言われる理由ですね。

—

「インデックススキャン」と「インデックスオンリースキャン」

さて、ここからが少しだけテクニカルな話ですが、めちゃくちゃ面白いところです。データベースがデータを探すとき、2つの「賢いやり方」があります。

1. インデックススキャン(索引を見て、本を開く)

これは、索引でページ数を確認してから、実際にそのページを開きに行く動作です。「佐藤さんの住所を知りたい」というとき、索引で「佐藤=105ページ」と見つけ、本棚(実際のデータテーブル)まで本を取りに行く。これが通常のインデックススキャンです。

2. インデックスオンリースキャン(索引だけで完結させる!)

これができたら最高です。もし、索引の中に「佐藤さんの電話番号」まで書かれていたらどうでしょう?わざわざ重たい本を開かなくても、索引を見ただけで答えがわかりますよね。

これをデータベースの世界では「インデックスオンリースキャン」と呼びます。
インデックスの中に必要な情報が全て揃っていれば、本体のデータを見に行く必要がないので、驚くほど速いんです!

—

パフォーマンスを上げるための「ちょっとしたコツ」

では、どうすればこの「オンリースキャン」を引き出せるのか? 実は、少しの工夫でクエリの速度は劇的に変わります。

  • 必要な列だけをSELECTする:

`SELECT ` で全部の列を持ってくるのではなく、本当に必要な列だけを指定しましょう。インデックスにその列が含まれていれば、オンリースキャンが発動する可能性がグッと高まります。

  • 複合インデックスの活用:

「苗字」と「名前」をセットでよく検索するなら、それらをセットにした「複合インデックス」を作ると、検索効率がさらに上がりますよ。

—

最後に:完璧を目指しすぎないことも大切

インデックスは便利ですが、貼れば貼るほどいいというわけではありません。
本で例えるなら、索引を何十種類も作ったら、それだけで分厚い本になってしまいますよね。データが新しく追加されるたびに、その全ての索引を書き直さないといけないので、逆に動作が重くなってしまうんです。

「よく検索する条件」を見極めて、そこにピンポイントでインデックスを貼る。この「引き算の感覚」が、優れたデータベースエンジニアへの第一歩です。

皆さんのデータベースが、今日もサクサク快適に動きますように!
また次回の記事でお会いしましょう。質問などあれば、いつでも気軽にコメントしてくださいね。

コメント

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