道具は問い合わせの形で選ぶ
読了目安 約2分
万能型の RDB を正としたうえで、キー引き・全文検索・類似検索といった問い合わせの形ごとに専門の道具を検討します。
この章の目次
MySQL のような、テーブルの形でデータを持つデータベースを RDB(関係データベース)と呼びます。 条件で絞り、テーブル同士をつなぎ、トランザクションで守れる万能型です。 迷ったら RDB に置く、が出発点です。
ただし問い合わせの形によっては、専門の道具が桁で勝ちます。
| 問い合わせの形 | 専門の道具 | 速い理由 |
|---|---|---|
| キーで 1 件引くだけ | Valkey、memcached | メモリ上の表を 1 回引くだけ |
| この語を含む文書を探す | OpenSearch | 転置インデックス |
| 似ているものを探す | OpenSearch(ベクトル検索) | 近似近傍探索 |
| 形の揃わない記録をそのまま入れる | MongoDB など | 入れ物の形を固定しない |
転置インデックスは、「語 → その語を含む文書の一覧」を先に作っておく索引です。
RDB で LIKE '%語%' と書くと全行を読むしかないので、文書が増えるほど差が開きます。
ベクトル検索は、文や画像を数値の並び(ベクトル)に変換し、距離が近いものを「似ている」として探します。 厳密に最も近いものを探すと高くつくので、わずかな取りこぼしと引き換えに速くする近似近傍探索が使われます。
道具を増やすと同期が付いてくる
専門の道具を足すと、同じデータが 2 か所に置かれます。 前章の線を守り、正は RDB のまま、専門の道具の側は「消えても作り直せるコピー」にします。
コピーを最新に保つ同期は、増やすほど遅くなることがある の協調の費用そのものです。 道具が 1 つ増えるたび、この費用と、覚える運用が 1 つずつ増えます。
ISUCON で支給される構成は、ほぼ RDB だけです。 道具を足すのは、その問い合わせが支配的だと計測で確定してからにしてください。 たいていは、インデックスと往復回数の削減で足ります。
試してみよう
次の 3 つの要件に、上の表から道具を選んでください。
- セッション ID からユーザー ID を、毎リクエスト 1 回引く
- 投稿の本文から「渋谷 ラーメン」を含むものを探す
- 注文履歴を注文 ID で引く。件数は多いが、金額の集計もトランザクションも要る
答えを見る
1 は Valkey か memcached です。キーで 1 件引くだけで、条件も集計も要りません。前章の表のとおり、プロセス内のメモリでも足りますが、サーバーを増やすと中身がずれる代償が付きます。
2 は OpenSearch です。LIKE '%渋谷%' は全行を読むので、投稿が増えるほど苦しくなります。
3 は RDB のままにします。キーで引く形でも、集計とトランザクションが要るなら万能型の仕事です。