muninで使われてるRRDtoolsとかは4GB rolloverを考慮した作りになってる
https://gist.github.com/tateisu/58d8e566f67a2cd3aa999c7c4b5e6ee1 FTLでは部分インデックスが使われなかったのでLTL専用のインデックスに書き直しました
このアカウントは、notestockで公開設定になっていません。
LTLが過疎りがちなおひとり様タンスだとLTL専用に部分インデックス作った方がいいんだろうなあ… FTLの方は別に最適化いらないだろうと思わなくもない
ほんとはLTLとFTL個別に部分インデックス作った方が速いけど、容量との兼ね合いもあるしどうなんだろ。FTLのクエリでさっきの部分インデックスが使われるのかどうか確認してない
このインデックス入れるとLTLが過疎ってる場合のAPI応答性が大幅に改善しますが、インデックスを増やすことによるコスト増加と見合うかどうかは人によると思います。
https://gist.github.com/tateisu/58d8e566f67a2cd3aa999c7c4b5e6ee1
というわけでLTL,FTLのクエリ負荷を軽くするインデックス。
CREATE INDEX accounts_not_silenced ON accounts using btree
(id)
WHERE not silenced;
CREATE INDEX statuses_public ON statuses using btree
(id,("statuses"."local" = TRUE OR "statuses"."uri" IS NULL))
WHERE "statuses"."visibility" = 0
AND (statuses.reblog_of_id IS NULL)
AND (statuses.reply = FALSE OR statuses.in_reply_to_account_id = statuses.account_id) ;
https://gist.github.com/tateisu/58d8e566f67a2cd3aa999c7c4b5e6ee1 部分インデックスを貼ると8msのクエリが1.5msになった
ああ、このケースだとaccounts.silences 見てるから結局アカウントテーブルにもアクセスが必要になるのか… cost見ると別に減ってないしなあ…
@zundan 時報か天気ボットでも入れてLTLを微妙に賑やかすと一発で解決するんでは。
あとaccounts へのjoinをin(select...) に置き換えると実行時間が44%下がります。
https://gist.github.com/tateisu/58d8e566f67a2cd3aa999c7c4b5e6ee1
久しぶりに詳細が見えた。/api/v1/timelines/public?local=true に20行で40秒
SELECT "statuses"."id", "statuses"."updated_at" FROM "statuses" LEFT OUTER JOIN "accounts" ON "accounts"."id" = "statuses"."account_id" WHERE ("statuses"."local" = ? OR "statuses"."uri" IS NULL) AND "statuses"."visibility" = ? AND (statuses.reblog_of_id IS NULL) AND (statuses.reply = FALSE OR statuses.in_reply_to_account_id = statuses.account_id) AND "accounts"."silenced" = ? ORDER BY "statuses"."id" DESC LIMIT ?