【入門編】 RUMインデックス拡張 – PostgreSQL

みなさん、こんにちは!データベースエンジニアの現場から、今日も「なるほど!」と思える技術の小ネタをお届けします。

普段、本や資料を探すとき、みなさんはどうしていますか?
例えば、何千冊もの本が並ぶ巨大な図書館で、「『冒険』というキーワードが出てくる本を全部持ってきて!」と司書さんに頼んだとします。もし司書さんが一冊ずつ全ページをめくっていたら、日が暮れてしまいますよね。

データベースの世界でも同じことが起きています。今日は、そんな「検索」の時間を劇的に短縮してくれる、PostgreSQLのちょっと特別な武器「RUMインデックス」についてお話しします。

—

全文検索の「定番」に足りないもの

PostgreSQLで全文検索をするとき、エンジニアたちはよく「GIN(ジン)」というインデックスを使います。これは、本の後ろにある「索引(さくいん)」みたいなものです。「この言葉は、このページとこのページにあるよ!」とあらかじめメモしておく仕組みですね。

でも、このGINくんにも苦手なことがあります。それは「ランキング」です。

たとえば、こんな検索をしたとします。
「『おいしいカレー』について書かれた記事を、新しい順に教えて!」

GINくんは「おいしい」「カレー」という言葉が含まれる記事はすぐに見つけてくれます。でも、「いつ書かれたか?」という時間情報までは、索引の中に詳しく記録していないんです。その結果、検索したあとにわざわざ「あ、これいつの記事だっけ…?」と、本の中身を一つずつ確認する手間が発生してしまいます。

これって、ちょっと非効率ですよね。

—

RUMインデックスは「超優秀なコンシェルジュ」

そこで登場するのが、GINの進化版とも言える「RUM(ラム)」インデックスです。

RUMは、ただ「どこに単語があるか」を覚えているだけではありません。「その言葉がどこに出てきたか(位置情報)」や「いつ書かれたものか(タイムスタンプ)」まで、索引の中に一緒にメモしておいてくれるんです。

イメージしてみてください。
優秀なコンシェルジュが、図書館の目録にこう書き込んでくれているようなものです。

  • 「『カレー』っていう単語は、この本の3ページ目と15ページ目にあるよ」
  • 「しかも、この本は2023年10月に出版されたものだよ」

こうなっていれば、検索するときに「『カレー』を含んでいて、かつ新しい順に並べて!」と言われた瞬間、コンシェルジュがその場でサッと答えを出してくれますよね。本の中身をいちいち確認する必要なんてありません。これが、RUMの強みなんです。

—

どんなときに使うのがいいの?

RUMは魔法の杖ではありません。GINよりも多機能な分、インデックスを作るのに少し時間がかかったり、保存する場所をたくさん使ったりします。

なので、こんなシーンで使うのがおすすめです。

  • ブログやニュースサイト: 「特定のキーワード」と「公開日時」を組み合わせて、最新の記事をすぐに出したいとき。
  • ログ解析: 「エラー」という単語が含まれるログのうち、一番最近発生したものを見つけたいとき。
  • ランキング機能が必要なアプリ: 検索結果の「関連度」や「時刻」をもとに、高速に並び替えを行いたいとき。

—

まとめ:道具は適材適所で

技術の世界には、便利な道具がたくさんあります。RUMのような拡張機能を知っておくと、今まで「データベースって検索が遅いな…」と諦めていたことが、驚くほどスッキリ解決することもあります。

まずは「インデックス=ただの索引」と思わず、「自分の代わりに整理整頓してくれる優秀な助手」だと考えてみてください。そうすると、データベースを設計するのが、ちょっとしたパズルみたいに楽しくなってきませんか?

もしみなさんのプロジェクトで、「全文検索をもっと速くしたい!」「検索結果をいい感じに並べたい!」という悩みがあったら、ぜひこの「RUM」を思い出してみてくださいね。

それでは、また次回の記事でお会いしましょう!Happy Hacking!

コメント

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