【入門編】 GiSTインデックス – PostgreSQL

やあ!今日もデータベースと格闘してる?
エンジニアとして歩んでいると、B-treeインデックス(いわゆる「辞書順」のインデックス)だけで事足りる世界ならどんなに楽か……なんて思うこと、あるよね。

でも、現実はもっと複雑だ。地図上の位置情報だったり、時間帯の重なりだったり、あるいは「この単語とあの単語が含まれる文書」を探したり。そんな「普通のインデックスじゃ荷が重い」データたちを、スマートにさばくための切り札。それがGiST(ジスト)インデックスなんだ。

今日は、このちょっと頼れる相棒について、肩の力を抜いてお話ししようと思う。

—

B-treeだけじゃ、解決できないこともある

まずは想像してみてほしい。君が図書館の司書さんだとするよ。
「著者名のあいうえお順」に並んでいる棚なら、B-treeインデックスで爆速で本を探せるよね。これは完璧だ。

でも、もし利用者がこう言ってきたらどうする?
「『東京駅』から半径2km以内のカフェが載っている地図を全部持ってきて!」

…困るよね。あいうえお順の棚から、そんな「場所」という条件で本を探し出すのは至難の業だ。「東京」という言葉が入っている本を全部引っ張り出して、その中からさらに位置情報を計算して……なんてやってたら、日が暮れちゃう。

こういう、「広がり」や「重なり」を持つ複雑なデータを扱うとき、僕らの救世主になってくれるのがGiSTなんだ。

—

GiSTって、結局なにもの?

GiSTは「Generalized Search Tree」の略なんだけど、そんな名前は覚えなくていい。「汎用的な検索ツリー」という意味で、要するに「工夫次第でどんな形でも探せる、柔軟な頭脳を持ったインデックス」だと思えばOK!

どんなふうに整理しているの?

GiSTのイメージは、「大きな箱の中に、小さな箱をどんどん入れ子にしていく」感じ。

1. まず、「東京」という大きなエリアの箱を作る。
2. その中に「中央区」や「千代田区」という中くらいの箱を入れる。
3. さらにその中に「カフェA」「カフェB」という小さな箱を入れる。

検索するときは、いきなり全部を見に行く必要はない。「半径2km以内」という条件に当てはまる箱だけをパカッと開けて、その中身をチェックすればいいんだ。外れている箱は、中身すら見なくていい。これが、GiSTが爆速の理由だよ。

—

こんなとき、GiSTを思い出してほしい

具体的にどんなデータで活躍するか、いくつか例を挙げておくね。

  • 地図アプリを作るなら(幾何データ)

「特定の範囲(ポリゴン)の中に含まれるスポット」を探すとき。

  • 予約管理システムなら(範囲型)

「14:00〜16:00の会議室の予約」と重なるスケジュールがないかチェックするとき。

  • ブログの検索機能なら(全文検索)

「特定のキーワードが含まれる記事」を素早く見つけたいとき。

実は、PostgreSQLの「PostGIS」という地理空間情報の拡張機能でも、このGiSTが裏方として大活躍しているんだ。君がスマホで地図を見るとき、裏ではGiSTがせっせと「どの箱を検索すべきか」を判断してくれているわけだね。

—

使うときの注意点

ここまで聞くと「最強じゃん!」と思うかもしれないけど、ちょっとだけ注意してほしいことがあるんだ。

GiSTはB-treeよりも「頭を使う」分、インデックスを作るのにも、データを更新するのにも少しだけコストがかかる。何でもかんでもGiSTにすればいいというわけじゃない。あくまで「B-treeじゃ無理なとき」の奥の手、と考えておこう。

最後に

データベース設計の世界って、適材適所なんだよね。
「今回は普通の数値検索だからB-treeでいこう」
「ここは位置情報が大事だからGiSTに任せてみよう」

こんなふうに、道具の特性を知って使い分けられるようになると、DB設計は一気に楽しくなるよ。もし君のプロジェクトで「検索が遅いな…」と悩む複雑なデータに出会ったら、ぜひGiSTのことを思い出してあげてほしい。

それじゃあ、また次回の記事で会おうね!良いコードライフを!

コメント

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