Задать вопрос

Агрегация большого кол-ва записей из БД?

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

На основе этих данных, необходимо строить различные отчеты по неделям, месяцам, кварталам, годам и т.п. (Sum, AVG, Count, Count Distinct и т.п).

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

Какие тут могут быть решения? Вообще что обычно используют для сбора и аналитики подобных статистических данных? Уместно ли вообще использовать MySQL для хранения постоянного потока данных (думаю что нет)?
  • Вопрос задан
  • 1734 просмотра
Подписаться 8 Средний 3 комментария
Ответ пользователя lega К ответам на вопрос (6)
@lega
Я уже на тостере пару раз описывал одно из решений (с расчетом на прирост до 2000 млн записей в день), в кратце:
* таблицы на свалку, нужно паковать чанками (например чанк - 1 час/день данных в разрезе раздела) с индексами в доль разрезов, можно использовать nosql (mongodb с шардингом, хотя вам и одного сервера наверно хватит)
* чанки паковать (экономия до 95% места)
* далее после завершения периодов запускаются задачи которые наполняют "кеш" - строят отчеты во всех разрезах + промежуточные результаты, что-бы пользователю выдавать результат моментально когда он кликает по интерфейсу.

я делал решение на питоне, там где расчет занимал длительное время - делал с++ вставки, в результате расчет выполнялся в ~ х70 раз быстрее, и питон прокачивал более 10млн записей в сек. в один поток с учетом выкачивания из БД
Ответ написан
Комментировать