From 441010ac653e0de6762af235b44b75f9dd7f30f8 Mon Sep 17 00:00:00 2001 From: Sam Date: Wed, 2 Oct 2013 17:08:53 +1000 Subject: [PATCH] optimise view count calculation query --- app/models/user.rb | 13 ++++++++----- ...070347_add_user_id_parent_type_index_on_views.rb | 5 +++++ 2 files changed, 13 insertions(+), 5 deletions(-) create mode 100644 db/migrate/20131002070347_add_user_id_parent_type_index_on_views.rb diff --git a/app/models/user.rb b/app/models/user.rb index 1d95fa9fc04..b1d41ad933a 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -329,12 +329,13 @@ class User < ActiveRecord::Base (SELECT v.user_id, COUNT(DISTINCT parent_id) AS c FROM views AS v - WHERE parent_type = 'Topic' + WHERE parent_type = 'Topic' AND v.user_id IN ( + SELECT u1.id FROM users u1 where u1.last_seen_at > :seen_at + ) GROUP BY v.user_id) AS X WHERE X.user_id = users.id AND - X.c <> topics_entered AND - users.last_seen_at > :seen_at + X.c <> topics_entered ", seen_at: 1.hour.ago # Update denormalzied posts_read_count @@ -343,10 +344,12 @@ class User < ActiveRecord::Base (SELECT pt.user_id, COUNT(*) AS c FROM post_timings AS pt + WHERE pt.user_id IN ( + SELECT u1.id FROM users u1 where u1.last_seen_at > :seen_at + ) GROUP BY pt.user_id) AS X WHERE X.user_id = users.id AND - X.c <> posts_read_count AND - users.last_seen_at > :seen_at + X.c <> posts_read_count ", seen_at: 1.hour.ago end diff --git a/db/migrate/20131002070347_add_user_id_parent_type_index_on_views.rb b/db/migrate/20131002070347_add_user_id_parent_type_index_on_views.rb new file mode 100644 index 00000000000..b1a20098d66 --- /dev/null +++ b/db/migrate/20131002070347_add_user_id_parent_type_index_on_views.rb @@ -0,0 +1,5 @@ +class AddUserIdParentTypeIndexOnViews < ActiveRecord::Migration + def change + add_index :views, [:user_id,:parent_type,:parent_id] + end +end