mirror of
https://github.com/dartdavros/chatballs.git
synced 2026-10-05 09:14:58 +03:00
Пагинация была правильной, но опиралась на то, что не ложится в индекс: список диалогов сортировался по агрегату max(messages.created_at) — GROUP BY по всей ленте на каждый запрос, — а превью строки и бейдж непрочитанных спрашивались по два запроса на диалог, тридцать раз на страницу, каждые четыре секунды. - Conversation.last_message_at: денормализованное поле вместо агрегата, держит сигнал на создание сообщения (одно место вместо семи), миграция заполняет существующие диалоги; - индексы: conv_inbox_order (организация → свежесть) и conv_message_window (диалог → время → id) — под окно инбокса и окно истории; conv_contact_recent под подзапросы списка контактов; триграммы для поиска по имени и телефону; - превью и бейдж считаются на страницу целиком (last_messages_for, pending_counts_for), а не построчно; - список сотрудников: своя сортировка групп в payload отменяла prefetch, а организация тянулась на каждую строку — обе связи взяты в выборке; - test_query_budget: число запросов сравнивается на разном объёме данных, так что вернуть N+1 незаметно больше нельзя; - журнал аудита переведён на общий usePagedResource — он был последним списком со своей копией отложенного поиска и защиты от гонок. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>