Skip to content

Commit 23b4f60

Browse files
committed
More performance optimization
* Added 2 additional indexes * Added the viewing window as an additional and condition so the query optimizer is able to push it into the subqueries, greatly speeding up new topic notifications on search pages.
1 parent ee3e225 commit 23b4f60

File tree

4 files changed

+25
-7
lines changed

4 files changed

+25
-7
lines changed

app/controllers/topics_controller.rb

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -221,17 +221,18 @@ def assign_branch_segments!
221221
def apply_cursor_pagination(base_query)
222222
@viewing_since = viewing_since_param
223223

224-
query_with_window = base_query.joins(:messages)
225-
.group('topics.id')
226-
.having('MAX(messages.created_at) <= ?', @viewing_since)
227-
.select('topics.*, MAX(messages.created_at) as last_activity')
224+
windowed_query = base_query.joins(:messages)
225+
.where(messages: { created_at: ..@viewing_since })
226+
.group('topics.id')
227+
.having('MAX(messages.created_at) <= ?', @viewing_since)
228+
.select('topics.*, MAX(messages.created_at) as last_activity')
228229

229230
if params[:cursor].present?
230231
cursor_time, cursor_id = params[:cursor].split('_')
231-
@topics = query_with_window.having('(MAX(messages.created_at), topics.id) < (?, ?)',
232+
@topics = windowed_query.having('(MAX(messages.created_at), topics.id) < (?, ?)',
232233
Time.zone.parse(cursor_time), cursor_id.to_i)
233234
else
234-
@topics = query_with_window
235+
@topics = windowed_query
235236
end
236237

237238
@topics = @topics.order('MAX(messages.created_at) DESC, topics.id DESC')
@@ -573,6 +574,7 @@ def viewing_since_param
573574

574575
def count_new_topics(base_query, viewing_since)
575576
base_query.joins(:messages)
577+
.where(messages: { created_at: viewing_since.. })
576578
.group('topics.id')
577579
.having('MAX(messages.created_at) > ?', viewing_since)
578580
.count
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
class AddMessageTopicCreatedAtIndex < ActiveRecord::Migration[8.0]
2+
def change
3+
add_index :messages, [:topic_id, :created_at, :id],
4+
order: { created_at: :desc, id: :desc },
5+
name: "index_messages_on_topic_id_and_created_at_desc_id_desc"
6+
end
7+
end
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
class AddMessageReadRangesRecencyIndex < ActiveRecord::Migration[8.0]
2+
def change
3+
add_index :message_read_ranges, [:user_id, :topic_id, :range_end_message_id],
4+
order: { range_end_message_id: :desc },
5+
name: "index_message_read_ranges_on_user_topic_range_end_desc"
6+
end
7+
end

db/schema.rb

Lines changed: 3 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)