みなさん、こんにちは!データベースエンジニアの現場から、今日も「なるほど!」と思える技術の小ネタをお届けします。
普段、本や資料を探すとき、みなさんはどうしていますか?
例えば、何千冊もの本が並ぶ巨大な図書館で、「『冒険』というキーワードが出てくる本を全部持ってきて!」と司書さんに頼んだとします。もし司書さんが一冊ずつ全ページをめくっていたら、日が暮れてしまいますよね。
データベースの世界でも同じことが起きています。今日は、そんな「検索」の時間を劇的に短縮してくれる、PostgreSQLのちょっと特別な武器「RUMインデックス」についてお話しします。
—
全文検索の「定番」に足りないもの
PostgreSQLで全文検索をするとき、エンジニアたちはよく「GIN(ジン)」というインデックスを使います。これは、本の後ろにある「索引(さくいん)」みたいなものです。「この言葉は、このページとこのページにあるよ!」とあらかじめメモしておく仕組みですね。
でも、このGINくんにも苦手なことがあります。それは「ランキング」です。
たとえば、こんな検索をしたとします。
「『おいしいカレー』について書かれた記事を、新しい順に教えて!」
GINくんは「おいしい」「カレー」という言葉が含まれる記事はすぐに見つけてくれます。でも、「いつ書かれたか?」という時間情報までは、索引の中に詳しく記録していないんです。その結果、検索したあとにわざわざ「あ、これいつの記事だっけ…?」と、本の中身を一つずつ確認する手間が発生してしまいます。
これって、ちょっと非効率ですよね。
—
RUMインデックスは「超優秀なコンシェルジュ」
そこで登場するのが、GINの進化版とも言える「RUM(ラム)」インデックスです。
RUMは、ただ「どこに単語があるか」を覚えているだけではありません。「その言葉がどこに出てきたか(位置情報)」や「いつ書かれたものか(タイムスタンプ)」まで、索引の中に一緒にメモしておいてくれるんです。
イメージしてみてください。
優秀なコンシェルジュが、図書館の目録にこう書き込んでくれているようなものです。
- 「『カレー』っていう単語は、この本の3ページ目と15ページ目にあるよ」
- 「しかも、この本は2023年10月に出版されたものだよ」
こうなっていれば、検索するときに「『カレー』を含んでいて、かつ新しい順に並べて!」と言われた瞬間、コンシェルジュがその場でサッと答えを出してくれますよね。本の中身をいちいち確認する必要なんてありません。これが、RUMの強みなんです。
—
どんなときに使うのがいいの?
RUMは魔法の杖ではありません。GINよりも多機能な分、インデックスを作るのに少し時間がかかったり、保存する場所をたくさん使ったりします。
なので、こんなシーンで使うのがおすすめです。
- ブログやニュースサイト: 「特定のキーワード」と「公開日時」を組み合わせて、最新の記事をすぐに出したいとき。
- ログ解析: 「エラー」という単語が含まれるログのうち、一番最近発生したものを見つけたいとき。
- ランキング機能が必要なアプリ: 検索結果の「関連度」や「時刻」をもとに、高速に並び替えを行いたいとき。
—
まとめ:道具は適材適所で
技術の世界には、便利な道具がたくさんあります。RUMのような拡張機能を知っておくと、今まで「データベースって検索が遅いな…」と諦めていたことが、驚くほどスッキリ解決することもあります。
まずは「インデックス=ただの索引」と思わず、「自分の代わりに整理整頓してくれる優秀な助手」だと考えてみてください。そうすると、データベースを設計するのが、ちょっとしたパズルみたいに楽しくなってきませんか?
もしみなさんのプロジェクトで、「全文検索をもっと速くしたい!」「検索結果をいい感じに並べたい!」という悩みがあったら、ぜひこの「RUM」を思い出してみてくださいね。
それでは、また次回の記事でお会いしましょう!Happy Hacking!
コメント