PERF: Optimize the performance of TopicLink.topic_map query (#19630)

Instead of relying on the `ILIKE` operator to filter out image links, we
can instead rely on the `TopicLink#extension` column which allows us to
more efficiently filter out image links.

This optimization mainly affects topics that are link heavy which is
common in topics with alot of replies. When profiling a production
instance for a topic with 10K replies and 2.5K `topic_links`, this
optimization reduces the query time from ~18ms to around ~4ms.
This commit is contained in:
Alan Guo Xiang Tan 2022-12-28 08:10:36 +08:00 committed by GitHub
parent aad63d92d2
commit 070eac16a8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -58,8 +58,7 @@ class TopicLink < ActiveRecord::Base
builder.where('ftl.topic_id = :topic_id', topic_id: topic_id) builder.where('ftl.topic_id = :topic_id', topic_id: topic_id)
builder.where('ft.deleted_at IS NULL') builder.where('ft.deleted_at IS NULL')
# note that ILIKE means "case insensitive LIKE" builder.where("ftl.extension IS NULL OR ftl.extension NOT IN ('png','jpg','gif')")
builder.where("NOT(ftl.url ILIKE '%.png' OR ftl.url ILIKE '%.jpg' OR ftl.url ILIKE '%.gif')")
builder.where("COALESCE(ft.archetype, 'regular') <> :archetype", archetype: Archetype.private_message) builder.where("COALESCE(ft.archetype, 'regular') <> :archetype", archetype: Archetype.private_message)
builder.where("clicks > 0") builder.where("clicks > 0")