🔩 ねじき教室 Go と Web の教室

ツールはアクセスパターンで選ぶ

読了目安 約2分

万能型の RDB を正としたうえで、キー引き・全文検索・類似検索といったアクセスパターンごとに特化したツールを検討します。

30秒でつかむ 正はDBに置き、検索の形に合う道具へ写す
正はDBに置き、検索の形に合う道具へ写すRDBを正にし、キー検索、全文検索、類似検索に特化したストアを必要に応じて組み合わせます。1キーと全文特化ストア2RDBデータの正3類似検索ベクトル検索
  1. キーと全文 特化ストア
  2. RDB データの正
  3. 類似検索 ベクトル検索
この章の目次

MySQL のような、テーブルの形でデータを持つデータベースを RDB(関係データベース)と呼びます。 条件で絞り、テーブル同士をつなぎ、トランザクションで守れる万能型です。 迷ったら RDB に置く、が出発点です。

ただしアクセスパターンによっては、特化したツールのほうが桁違いに速くなります。

アクセスパターンツール速い理由
キーで 1 件引くだけValkey、memcachedメモリ上の表を 1 回引くだけ
この語を含む文書を探すOpenSearch転置インデックス
似ているものを探すOpenSearch(ベクトル検索)近似近傍探索
形の揃わない記録をそのまま入れるMongoDB など入れ物の形を固定しない

転置インデックスは、「語 → その語を含む文書の一覧」を先に作っておく索引です。 RDB で LIKE '%語%' と書くと全行を読むしかないので、文書が増えるほど差が開きます。

ベクトル検索は、文や画像を数値の並び(ベクトル)に変換し、距離が近いものを「似ている」として探します。 厳密に最も近いものを探すと高くつくので、わずかな取りこぼしと引き換えに速くする近似近傍探索が使われます。

ツールを増やすと同期が付いてくる

特化したツールを足すと、同じデータが 2 か所に置かれます。 前章の線を守り、正は RDB のまま、特化したツールの側は「消えても作り直せるコピー」にします。

コピーを最新に保つ同期は、増やすほど遅くなることがある の協調の費用そのものです。 ツールが 1 つ増えるたび、この費用と、覚える運用が 1 つずつ増えます。

ISUCON で支給される構成は、ほぼ RDB だけです。 ツールを足すのは、そのアクセスパターンが支配的だと計測で確定してからにしてください。 たいていは、インデックスと往復回数の削減で足ります。

試してみよう

次の 3 つの要件に、上の表からツールを選んでください。

  1. セッション ID からユーザー ID を、毎リクエスト 1 回引く
  2. 投稿の本文から「渋谷 ラーメン」を含むものを探す
  3. 注文履歴を注文 ID で引く。件数は多いが、金額の集計もトランザクションも要る
答えを見る

1 は Valkey か memcached です。キーで 1 件引くだけで、条件も集計も要りません。前章の表のとおり、プロセス内のメモリでも足りますが、サーバーを増やすと中身がずれる代償が付きます。 2 は OpenSearch です。LIKE '%渋谷%' は全行を読むので、投稿が増えるほど苦しくなります。 3 は RDB のままにします。キーで引く形でも、集計とトランザクションが要るなら万能型の仕事です。