Сортировка по совокупности на большом наборе данных в режиме реального времени

#mysql #database #aggregate #scalability #bigdata

#mysql #База данных #агрегат #масштабируемость #bigdata

Вопрос:

Я хотел бы позволить пользователям сортировать видео по «наиболее просматриваемым» по периоду (день, неделя, месяц, год и т. Д.).

В настоящее время все данные находятся в MySQL, и в основном настройка представляет собой таблицу «видео» и таблицу «просмотры», которая содержит строки со столбцами video_id, session_id и datetime.

Для сортировки по «наиболее просматриваемым» для каждого видео генерируется вычисляемое поле с помощью функции COUNT(), которая подсчитывает все просмотренные строки за указанный период. На данный момент это отлично работает для таких периодов, как «час» и «день», но такие периоды, как «месяц» и «год», могут занять много времени.

Проблема в том, что это не масштабируемо. У меня есть тысячи видео, и большинство видео генерируют тысячи просмотров каждый месяц, что в сумме составляет миллионы просмотров каждый месяц.

Я прошу общего решения / стратегии, которая является масштабируемой. Возможно ли подобное вообще в MySQL или мне следует рассмотреть другую базу данных?

Ответ №1:

Для статистики использования (или журналов) данных может использоваться следующая стратегия агрегирования:

  • предварительно рассчитайте агрегаты до некоторого периода (скажем, не включая «сегодня»). Серверы OLAP могут это делать, но, конечно, вы можете сделать это более простым способом с помощью пользовательского кода, если вам не нужно универсальное решение. Эти агрегаты должны быть пересчитаны по окончании периода (например, в начале дня).
  • чтобы получить фактические результаты в режиме реального времени, вам нужно выполнить агрегацию только для «сегодня». Это будет работать быстро, но если у вас много посетителей, вы можете кэшировать эту агрегацию тоже в течение короткого периода времени (скажем, несколько секунд).
  • когда вам нужно выбрать «наиболее просматриваемые» результаты, вам нужно объединить предварительно рассчитанные агрегаты (по всем статистическим данным до сегодняшнего дня) и объединить их с сегодняшней статистикой, агрегированной в режиме реального времени

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