discourse/plugins/chat/db
Sam 83bed592e2
PERF: speed up chat channel and thread unread queries (#39398)
Rewrites the channel and thread unread queries to use a CTE that
picks the candidate set up front, followed by LATERAL subqueries
for each aggregate. The previous form used three correlated
subqueries that each re-joined the user's full membership lists,
and packed the unread predicate into a single OR-bag that forced
a sequential scan over every message past last_read_message_id.

The channel query now:
- Limits candidate channels in a CTE before aggregating.
- Splits unread_count into three additive, index-friendly pieces
  (standalone messages, thread original messages, and DM thread
  replies) instead of one OR branch.
- Pushes the muted check into a CASE on the outer row.

The thread query now:
- Orders candidate memberships by last_message_id and caps them
  at MAX_THREADS in the CTE, so recent threads always win.
- Derives unread and watched counts from a single aggregate
  switched by notification_level.
- Skips threads whose channel membership is missing.

Also adds a covering index on chat_messages(thread_id, id) INCLUDE
(user_id) WHERE deleted_at IS NULL to support the thread aggregates
as index-only scans, and adds specs for the orphaned-thread case
and the MAX_THREADS recency cap.

---

This gives this about 50x perf improvement in testing

---------

Co-authored-by: Martin Brennan <martin@discourse.org>
2026-04-22 14:57:56 +10:00
..
fixtures DEV: properly namespace chat (#20690) 2023-03-17 14:24:38 +01:00
migrate PERF: speed up chat channel and thread unread queries (#39398) 2026-04-22 14:57:56 +10:00