From f0f3deb32b84c87390aa9323597c13818bd6084a Mon Sep 17 00:00:00 2001 From: Guo Xiang Tan Date: Mon, 8 Apr 2019 17:46:49 +0800 Subject: [PATCH] PERF: Simplify query of `UserStat#update_topic_reply_count`. For a user with alot of posts, we get a 25% speed up. --- app/models/user_stat.rb | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/app/models/user_stat.rb b/app/models/user_stat.rb index e512a942e92..a1b39d551d2 100644 --- a/app/models/user_stat.rb +++ b/app/models/user_stat.rb @@ -129,15 +129,11 @@ class UserStat < ActiveRecord::Base # topic_reply_count is a count of posts in other users' topics def update_topic_reply_count self.topic_reply_count = - Topic - .where(['id in ( - SELECT topic_id FROM posts p - JOIN topics t2 ON t2.id = p.topic_id - WHERE p.deleted_at IS NULL AND - t2.user_id <> p.user_id AND - p.user_id = ? - )', self.user_id]) - .count + Topic + .joins("INNER JOIN posts ON topics.id = posts.topic_id AND topics.user_id <> posts.user_id") + .where("posts.deleted_at IS NULL AND posts.user_id = ?", self.user_id) + .distinct + .count end MAX_TIME_READ_DIFF = 100