検索がものすごく遅い場合
noteテーブルに対してPGroongaもしくはpg_trgmでインデックスを作ると検索がものすごく速くなりお得。
Misskeyのノート検索ではILIKEクエリ(「く」が…)を使っているため
該当する箇所のソースコードを変えて仕様変更しない限りはILIKEクエリのインデックスに対応するPGroongaかpg_trgmのどちらかを使うことになります。
後者のpg_trgmを使う場合の注意点として
pg_trgmは2-gram方式のため検索ワードが2文字以下の場合においてはインデックスの効果を発揮しません。
(インデックスをしていない場合よりも遅くなるらしい?)
またデフォルトでは日本語非対応なので#define KEEPONLYALNUM
をコメントアウトしてビルドし直す必要があります。
のですが、Postgres公式のUbuntuリポジトリのpg_trgmはなぜかそのまま使っても日本語でしっかり動きました(謎)
そういったことがあるためパフォーマンスも良いことで有名なPGroongaを採用するのがおすすめです。
僕はPostgres14でPGroongaを動かす方法を調べる元気がなかったのでpg_trgmを使っています。
ということで何故かpg_trgmを使う場合の手順を今から書きます。
データベースでpg_trgm拡張機能を有効化する(PGroongaを使う場合は事前にPGroongaのインストールが必要)
postgres@server:$ psql misskey
misskey=> CREATE EXTENSION pg_trgm;
PGroongaを使う場合はmisskey=> CREATE EXTENSION pgroonga;
インデックスを生やす
misskey@server:$ psql
misskey=> CREATE INDEX CONCURRENTLY index_of_kensaku ON note USING gin (text gin_trgm_ops);
PGroongaを使う場合はmisskey=> CREATE INDEX CONCURRENTLY index_of_kensaku ON note USING pgroonga (text);
Postgresの再起動
root@server:# systemctl restart postgresql
できた
ほにクラブ[note: 7GB (5,934,798 recs)]環境ではCREATE INDEX CONCURRENTLY
に5分くらいかかりました。
すんごく速くなってかなりお得だった(ノート検索に15~40秒くらいかかってたのが1秒未満に…)
というかデータベースってインデックス作らないと遅くなるのがたぶん常識なんだろうな…
僕は何も知らなかった…