В мае была добавлена новая функция Selective dismissal of New and Unread topics. Мы недавно обновились до последней версии Discourse и, посмотрев на код и логи нашей БД, видим, что когда пользователи нажимают «Скрыть новые» без выбора (то есть просто массовое скрытие), мы передаем tracked = false и ничего больше в параметрах запроса для reset-new.
И поскольку мы не передаем topic_ids, мы пропускаем оператор if и автоматически переходим к строке 989.
У нас работает довольно большой сервер Discourse, и я считаю, что идея просто иметь все темы довольно затратна, так как запрос фактически генерирует:
LEFT JOIN topic_users ON topic_users.topic_id = topics.id AND topic_users.user_id = xxx WHERE "topics"."deleted_at" IS NULL AND "topics"."id" IN (1, ... 1000000) AND (topics.created_at >= 'date') AND (topic_users.last_read_post_number IS NULL) AND (topics.archetype <> 'private_message') ORDER BY topics.created_at DESC LIMIT 500
В условии IN, как я полагаю, почти каждая тема в диапазоне более 1 миллиона.
Можно ли по умолчанию при массовом выборе передавать только topic_ids вместо того, чтобы по умолчанию использовать все возможные темы?
@martin Привет, извини за уведомление, похоже, что ты запушил коммит, на который есть ссылка выше.
Не мог бы ты проверить, является ли это верной основной причиной того, что мы наблюдаем? В случае «отклонить все новые» в запросах появляются огромные списки фильтров (~миллион идентификаторов тем). (на нашем форуме размещено множество тем Discourse)
Мы могли бы помочь с PR для решения этой проблемы, если у команды Discourse нет приоритета на это, но я сомневаюсь, что мы единственные, кого это затрагивает; это также может влиять на производительность базы данных у некоторых из ваших клиентов.
Спасибо @forkythetoy и @Hooksmith за то, что обратили на это моё внимание. Я подтвердил, что это огромный запрос, даже здесь, на meta. Сегодня я напишу исправление: оно будет таким же простым, как использование только ID тем, которые отображаются в списке «Новые» для пользователя, а не всех тем, когда-либо созданных. Опубликую здесь, когда патч будет готов.