こんにちは!データベースの世界へようこそ。
PostgreSQLを触り始めると、必ずと言っていいほど耳にするのが「インデックス」という言葉。特にその代表格である「B-tree(ビーツリー)インデックス」は、DBエンジニアとして一生付き合っていく、いわば一番の親友のような存在です。
今日は、このB-treeが一体何をしてくれているのか、専門用語を極力使わずに紐解いていきましょう。
—
本の「索引」を想像してみてください
突然ですが、あなたは今、800ページある分厚い専門書の中から「PostgreSQL」という単語を探さなければならないとします。どうやって探しますか?
1. 1ページ目から順番に、隅から隅まで読み込む。
2. 巻末の「索引(インデックス)」を開いて、「ぽ」の項目を探す。
おそらく、誰もが2番の方法を選びますよね。もし1ページ目から探していたら、読み終わる頃には日が暮れてしまいます。
B-treeインデックスは、データベースにとってのこの「索引」そのものなんです。
B-treeの「B」は、バランスのB?
データベースのデータ量が数万、数百万と増えていくと、全部を順番に見ていくのは現実的じゃありません。そこで登場するのがB-treeという仕組みです。
B-treeを日常に例えるなら、「図書館の検索システム」や「住所録」が一番近いです。
例えば、誰かの名前を探すとき、いきなり「あ」から「ん」まで全部見ないですよね。「佐藤さん」なら「さ行」を開き、「さ」のページを開き……というふうに、情報を絞り込みながら目的地にたどり着くはずです。
B-treeの中身もこれと同じで、データを「枝分かれした木の構造」にして整理整頓しています。
- 上の方の枝で大まかなあたりをつける
- 下の枝に進んで、さらに絞り込む
- 最終的に、お目当てのデータがある場所に「ドンピシャ」でたどり着く
この「枝分かれ」のおかげで、たとえデータが何百万件あっても、ほんの数ステップで目的のデータを見つけ出せるんです。これが、B-treeが「爆速」である秘密です。
なぜ「B-tree」がデフォルトなの?
PostgreSQLを作っている賢い人たちは、数あるインデックスの種類の中から、なぜB-treeを標準に選んだのでしょうか。それは、B-treeが「オールマイティで空気が読める子」だからです。
B-treeは、こんな検索が得意です。
- 「ちょうどこの値を探したい!」(等価比較:`user_id = 123`)
- 「この範囲に入っているもの全部!」(範囲検索:`price > 1000 AND price < 5000`)
日常業務で使う検索のほとんどは、この2つに集約されますよね。どんな状況でも安定して高いパフォーマンスを出してくれる。だからこそ、PostgreSQLは迷わずこれをデフォルトにしているんです。
最後に:インデックスは「魔法の杖」ではない
ここまで褒めちぎりましたが、一つだけ大切な注意点があります。
本に索引をたくさん載せすぎると、本自体が重くなって持ち運びが大変になりますよね。データベースも同じで、インデックスを作りすぎると、今度は「データの追加や更新」が遅くなってしまいます。 データを書き換えるたびに、索引(インデックス)も書き直さないといけないからです。
インデックスは「必要な場所に、必要な分だけ」貼るのが、熟練エンジニアの流儀です。
まずは「困ったらとりあえずB-treeを貼ってみる」。そこから始めてみてください。少しずつ、データベースがあなたの意図を汲んで、素早く答えてくれるようになるはずですよ。
それでは、また次回の記事でお会いしましょう!データベースライフを楽しんでくださいね。
コメント