うーん頭と喉が痛い
この冬休みにやること、決めた
ミスキーのDBをAlloyDB Omniに切り替えてみる。それで、素のLIKE検索がどのくらい速くなるか試してみる
それで今はmeilisearchが3GB使っちゃってるんだから、AlloyDB Omni一本で動かせば運用楽になる上にメモリまで余裕増える
AlloyDBのLIKE検索の速さ。
続きの検索に時間がかかるあたりを見ると、OFFSET/LIMITが入ると重くなるところがあるのかな?
AlloyDBのポスグレ互換性はすごいな、どう互換性が高いかというと、/docker-entrypoint-initdb.d/ にSQLファイルを置いておくと初期化に使ってくれるというあたりも再現されてる
再現されてるってか、ポスグレベースで作ったから使用を引き継いでるって感じかな?
● reax.workからのお知らせ●
ノート検索に高速全文検索ソフトウェアのmeilisearchを使ってきましたが、使うのをやめました。
これによりノート検索の応答がこれまでほぼ一瞬だったのが5〜10秒ほど待たされるようになります。
その代わり、検索精度がこれまで一定低いところがあった(キーワード見逃しや、ある程度古いノートが対象外になったり etc.)問題がなくなっています。
AlloyDB Omniを試した所感:
- dockerイメージのイメージ名を google/alloydbomni に書き換えるだけで、ポスグレイメージとまったく同じ感じに立ち上がる
- ポスグレのバックアップダンプをそのままリストアできる
- データベース内に、publicスキーマのほかにgoogleなんとかってスキーマも作ってくる。なんに使っているスキーマかはよくわからない
- よって、AlloyDB OmniのDBをバックアップしてそれをポスグレにリストアしようとすると、「そんなスキーマはない」というエラーが何回か発生することになる(リストア自体は成功する)
- LIKE全文検索の速度は、700万行、4GB程度のテーブルでは目に見えるほどはなかった
- メモリ使用量も目に見える差はなかった
ノートの高速検索っていうと皆さんmeilisearchかpgroongaかって議論しがちなんですけど、ポスグレの世界でもうちょいメジャーな選択肢ってpg_trgmじゃないですかねというのを考えており、Misskeyのコードをちょっといじってpg_trgmに対応させるのを試し中。
pg_trgmはILIKE演算子が使えないという弱点があり、じゃあどうすればいいかというと lower(note) LIKE '%小文字化した検索語%' ですよね、そういう風にコードをちょっと書き換えちゃう感じ。
StackOverflowの皆様調べなんだけど、この書き方のほうがそもそも素でもILIKEよりちょっと速いケースが多いらしい
pg_trgmじゃないや、pg_bigm。
pg_trgmはポスグレに標準で入っているしILIKEにも使えるけど、日本語検索ができないやつ。pg_bigmね、サードパーティライブラリで、日本語検索もできて、ILIKEは使えないやつ。
pg_bigmをインストールしたPG15イメージのdockerfileはわりと簡単に書けた。
FROM postgres:15
RUN apt update
RUN apt install -y curl make gcc postgresql-server-dev-15
RUN curl https://github.com/pgbigm/pg_bigm/archive/refs/tags/v1.2-20240606.tar.gz -L -o pg_bigm-1.2-20240606.tar.gz
RUN tar zxf pg_bigm-1.2-20240606.tar.gz
RUN cd pg_bigm-1.2-20240606 && make USE_PGXS=1 && make USE_PGXS=1 install
RUN echo shared_preload_libraries='pg_bigm' >> /var/lib/postgresql/data/postgresql.conf