PERF: improve performance of publish_notifications_state

User.publish_notifications_state is called every time a notification is
created, this can become a very critical code path.

On some heavy notification related sites this can be a major CPU user on PG

This index makes it much cheaper to publish notification state, cause a
simple index lookup does the trick.
This commit is contained in:
Sam Saffron 2019-05-14 16:02:55 +10:00
parent dafc941a04
commit 624184560e
3 changed files with 25 additions and 0 deletions

View File

@ -246,6 +246,7 @@ end
#
# idx_notifications_speedup_unread_count (user_id,notification_type) WHERE (NOT read)
# index_notifications_on_post_action_id (post_action_id)
# index_notifications_on_read_or_n_type (user_id,id DESC,read,topic_id) UNIQUE WHERE (read OR (notification_type <> 6))
# index_notifications_on_user_id_and_created_at (user_id,created_at)
# index_notifications_on_user_id_and_id (user_id,id) UNIQUE WHERE ((notification_type = 6) AND (NOT read))
# index_notifications_on_user_id_and_topic_id_and_post_number (user_id,topic_id,post_number)

View File

@ -17,5 +17,6 @@ end
#
# Indexes
#
# idx_user_custom_fields_last_reminded_at (name,user_id) UNIQUE WHERE ((name)::text = 'last_reminded_at'::text)
# index_user_custom_fields_on_user_id_and_name (user_id,name)
#

View File

@ -0,0 +1,23 @@
# frozen_string_literal: true
class AddReadNotificationIndex < ActiveRecord::Migration[5.2]
disable_ddl_transaction!
def up
# doing this by hand cause I am ordering id DESC
execute <<~SQL
CREATE UNIQUE INDEX CONCURRENTLY index_notifications_on_read_or_n_type
ON notifications(user_id, id DESC, read, topic_id)
WHERE read or notification_type <> 6
SQL
# we need to do this to ensure this index hits
# on some sites this was missing prior
execute <<~SQL
VACUUM ANALYZE notifications
SQL
end
def down
raise ActiveRecord::IrreversibleMigration
end
end