• Какие технологии использовать для частого обновления большого количества строк в БД?

    leahch
    @leahch
    3D специалист. Dолго, Dорого, Dерьмово.
    У Вас выбрана плохая схема обновления рейтингов. При такой схеме, чем больше комментариев, тем с каждым разом будет труднее их обновлять, ведь придется каждый раз пробегать все записи.
    Зачем пересчитывать рейтинг каждый раз для ВСЕХ записей? Попробуйте сделать рейтинг счетчиками, а уж счетчики пересчитывать в проценты или что там у Вас на лету.
    К примеру, изначально:
    запись 1 - счетчик 1
    запись 2 - счетчик 1
    запись 3 - счетчик 1

    Далее, на запись 2 было сделано последовательно 10 комментариев (при каждом комментарии обновляем счетчик записи), стало
    запись 1 - счетчик 1
    запись 2 - счетчик 11
    запись 3 - счетчик 1
    комментарий 1, для записи 2, счетчик, 1
    ...
    комментарий 10, для записи 2, счетчик, 1

    Теперь для составления рейтинга нам достаточно найти только максимум по счетчику, приняв его за 100 процентов, в текущем случае будет 11. И ничего не нужно обновлять по крону, никакого перебора записей нам не нужно.
    Например на 5 записей:
    запись 1 - счетчик 33
    запись 2 - счетчик 78
    запись 3 - счетчик 3
    запись 4 - счетчик 22
    запись 5 - счетчик 15
    Максимум у нас MAX = 78, рейтинг считаем по формуле счетчик зиписи * ( 100 / MAX )
    Итого при выборе максимума и любой из записей будет
    запись 1 - счетчик 33 - рейтинг 42
    запись 2 - счетчик 78 - рейтинг 100
    запись 3 - счетчик 3 - рейтинг 4
    запись 4 - счетчик 22 - рейтинг 28
    запись 5 - счетчик 15 - рейтинг 19

    Э... Данная схема будет давать не только абсолютный рейтинг, но и относительный по выбору максимума из выборки записей (извиняюсь за тавтологию). Другими словами, если записи сгруппированы как-то по тегам, то поиск максимума по счетчику с выборкой по тегу будет ранжировать записи относительно этой выборки.

    PS. Уф, вот запилил-то... Задавайте вопросы.
    Ответ написан
    3 комментария
  • Какие технологии использовать для частого обновления большого количества строк в БД?

    @AlekseyKuzmin
    SPB
    вариант 1. изменить структур хранения. Рейтинг хранить в другой таблице. Разнести комментарии не несколько шардов.
    вариант 2. апдейтить рейтинг конкретного пользователя когда он оставит комментарий, а не всех пользователей подряд.
    вариант 3. - вариант 1 + 2 и задания на обновления рейтинга ставить в очередь в том же редисе с замещением старых заданий. Так рейтинг будет обновляться, но не чаще чем раз в 5 мин (например). Если юзер за 5 мин оставить 10 комментариев - рейтинг обновиться только 1 раз. Система будет устойчивее. будут задержки в обновлении рейтинга, но главное все остальное будет работать.
    Ответ написан
    Комментировать