PERF: Add index on topic_id and created_at to posts table (#22818)

Why this change?

In `PostDestroyer#make_previous_post_the_last_one` and
`Topic.reset_highest`, we have a query that looks something like this:

```
SELECT user_id FROM posts
WHERE topic_id = :topic_id AND
      deleted_at IS NULL AND
      post_type <> 4
      #{post_type}
ORDER BY created_at desc
LIMIT 1
```

However, we currently don't have an index that caters directly to this
query. As a result, we have seen this query performing poorly on large
sites if the PG planner ends up using an index that is suboptimal for
the query.

This commit adds an index to the `posts` table on `topic_id` and then
`created_at`. For the query above, PG will be able to do a backwards
index scan efficiently.
This commit is contained in:
Alan Guo Xiang Tan 2023-07-27 10:55:10 +08:00 committed by GitHub
parent 0a56274596
commit fe5cd479eb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 15 additions and 0 deletions

View File

@ -1320,6 +1320,7 @@ end
# index_posts_on_id_topic_id_where_not_deleted_or_empty (id,topic_id) WHERE ((deleted_at IS NULL) AND (raw <> ''::text))
# index_posts_on_image_upload_id (image_upload_id)
# index_posts_on_reply_to_post_number (reply_to_post_number)
# index_posts_on_topic_id_and_created_at (topic_id,created_at)
# index_posts_on_topic_id_and_percent_rank (topic_id,percent_rank)
# index_posts_on_topic_id_and_post_number (topic_id,post_number) UNIQUE
# index_posts_on_topic_id_and_sort_order (topic_id,sort_order)

View File

@ -0,0 +1,14 @@
# frozen_string_literal: true
class AddIndexTopicIdCreatedAtOnPosts < ActiveRecord::Migration[7.0]
disable_ddl_transaction!
def up
remove_index :posts, %i[topic_id created_at], algorithm: :concurrently, if_exists: true
add_index :posts, %i[topic_id created_at], algorithm: :concurrently
end
def down
remove_index :posts, %i[topic_id created_at], algorithm: :concurrently, if_exists: true
end
end