-
-
Notifications
You must be signed in to change notification settings - Fork 1.4k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
ノート数が多いインスタンスで、フォローが少ないとホームタイムラインの読み込みでクエリタイムアウトになる #9205
Comments
インデックス張ってあるのに何故だろう |
リストやローカルもめっちゃ遅い感じが? |
日付順にソートするのに時間かかってるとか(適当) |
みたいな、最新から数えていってタイムラインに表示すべき投稿を埋めるまでかなりの数をシークする必要があるケースで遅くなっている気がする(つまりシーケンシャルスキャンしている→インデックスが効いてない) |
ミュートなりブロックなりでインデックスが効かなくなる説 |
例えば一ヶ月以内の投稿しか対象にしないようにしたら改善するかな |
効果なかった |
MastodonとかはRedisにタイムラインを保持している(DBの検索はやらないとかなんとか) |
Issueはこちら |
あるんだ |
でもシークが問題なら、あまり参照されない古い投稿を取り出すのも遅いんじゃね? |
いやノートを検査しまくらないから早くなるか |
ユーザーのファイル付き投稿一覧を取得するのもしんどかったりする |
misskey/packages/backend/src/server/api/endpoints/notes/timeline.ts Lines 74 to 80 in 5af8b77
L78 と L79 が OR で繋がっているのでインデックスが使えていないのだと思います。 この部分を SQL で書くと
のようになりますが、これを OR を使わない形に変える、例えば UNION を使って
とすると速くなります。 ですがまだ数秒かかってしまう感じ(ちゃんと調べてませんが、多分サブクエリが複数回呼ばれてその分遅くなっている?)なので、この部分を内部結合にして
とすると一瞬で返るようになります(内部結合にしたことで1回だけ呼ばれるようになるはず)。 ただ TypeORM では UNION がサポートされていないっぽい。 |
あまり詳しくなくて恐縮なのですが、フォローがあるユーザーはIN句で自身もまとめて検索するのはどうでしょうか?
冗長かもしれませんがORでインデックスが外れることを考えるとこっちでも良いのではと思いました |
フォローがあるユーザーはIN句で自身もまとめて検索、のところは上で書いたやつの 1 つ目の案になりますね。 UNION は TypeORM で対応しておらずクエリ直書きの力技になってしまうので他の方法を考えているところ。 1 クエリになっているのを崩さないように考えていたが、先にフォロイーを取得してしまって 2 クエリにすれば解決しそうなのでやってみる。 |
💡 Summary
🥰 Expected Behavior
🤬 Actual Behavior
📝 Steps to Reproduce
📌 Environment
Misskey version:
Your OS:
Your browser:
The text was updated successfully, but these errors were encountered: