@jazzus

Насколько данный запрос будет грузить систему?

Mysql. php 7. laravel 5.8. vps ubuntu.
Запрос
DB::update('UPDATE lists SET rank=(@cnt:=@cnt+1) WHERE !@cnt:=0 ORDER BY updated_at DESC');

Обновляет рейтинг объектов (числовое поле rank у каждой записи таблицы). Данный запрос в данный момент работает для небольшого количества записей. Работает быстро.
Моделируем ситуацию. 30 тыс. пользователей. Ранг должен обновиться по причине события. Которое может произойти 50-100 раз в час. Целесообразно ли применять данный запрос в данных условиях? Т.е. с частотой 100 раз в час для 30 тыс записей. Можно поставить в крон и обновлять раз в час (план B), но хотелось бы, чтобы юзер видел обновление рейтинга сразу после события. Оценить происходящее в запросе могу только примерно т.к. в рав запросах не разбираюсь. Спасибо.
  • Вопрос задан
  • 94 просмотра
Решения вопроса 1
@Vitsliputsli
Обычно советуют держать бд в нормализованном состоянии. У вас есть поле updated_at ориентируйтесь на него при расчете рейтинга.
Если же начались проблемы с производительностью, тогда денормализация, выделяйте рейтинг в отдельный столбец. В этом случае, можно рейтинг высчитывать уже при записи updated_at, беря текущий рейтинг и обрабатывая только записи до этого рейтинга. Т.е. если рейтинг был 8, то нужно поменять рейтинг только у этих первых 8.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
А надо именно всю таблицу апдейтить?
Ограничить никак по конкретному юзеру?
Если железо норм, то 30 тыс не проблема, но стоит учитывать и другую нагрузку на бд.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы