独自の解決策といっても、Statusテーブルに「メディアあるよ」のフラグを追加するくらいしか思いつかないんだけど、データベースのマイグレーションはMastodon公式の対策とかぶったときに面倒になりそうなのでやりたくない。。
今はおとなしくあっちの回答を待つつもりです

media_attachments テーブルにstatus_idで引けるインデクスがあるので、おそらくそのようなフラグは必要ありません。 github.com/mastodon/mastodon/b

ありがとうございます。
あすか素人なので思いつきでしか発言できないのですが、メディアタイムラインの表示は現状、下記の処理でStatusを絞り込んでいます。

app/models/publicfeed.rb
```
def media
only_scope
Status.joins(:media_attachments).group(:id)
end
```

メディアのテーブルをJoinしたうえでGroup Byしているのですが、これらは低速なんじゃないかと思います。Joinしなくてもいいようにこのフラグつけたほうがいいんじゃないかと思ってました。。

mastodonにデフォルトでpgHero入ってて、Slow Queryの一覧が見れると思います。

ここのクエリ一覧に出ないクエリは通常は最適化する必要がありませんし、最適化する場合にはバインドパラメータを適当に補ってからpsql で explain analyze することで問い合わせ計画が妥当かどうか調べることができます。

フォロー

@tateisu @askyq とりあえずanalyze;

なんでこれこんなに遅いんだろう? と思ったら、先にやっといた方がいいです。統計情報が実態と乖離して遅くなってることがあって、コードみて原因不明だったものが一発でなおったりします。

で、そんなに遅いクエリーだったかな……。ウチの連合でメディアの有無はよく切り替えるけど、重くはないなあ。


ありがとうございます。
うちのサーバーでは、連合タイムラインはすぐ結果を返します。重いのはローカルだけです。

ならばそれはmedia_attachmentsの問題ではないですね。うちはLTL用のインデクス追加してます。小規模サーバには有効

Statusテーブルにあるlocalにインデックス追加する感じですかね?

\d statuses
(snip)
"index_statuses_local_20190824" btree (id DESC, account_id) WHERE (local OR uri IS NULL) AND deleted_at IS NULL AND visibility = 0 AND reblog_of_id IS NULL AND (NOT reply OR in_reply_to_account_id = account_id)

"statuses_public_local" btree (id) WHERE visibility = 0 AND reblog_of_id IS NULL AND (reply = false OR in_reply_to_account_id = account_id) AND (local = true OR uri IS NULL)


どっちが使われてたかなあ…。部分インデクスでLTLに出る投稿だけをインデクスに含めています。このへんは問い合わせ計画見ながらインデクス作ったり削除したりして試行錯誤するとよいでしょう。

@askyq @tateisu 他の条件との組み合わせとなれば、やはり実行計画みてくしかないですねー

ログインして会話に参加
Fedibird

様々な目的に使える、日本の汎用マストドンサーバーです。安定した利用環境と、多数の独自機能を提供しています。