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

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

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

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

Какие тут могут быть решения? Вообще что обычно используют для сбора и аналитики подобных статистических данных? Уместно ли вообще использовать MySQL для хранения постоянного потока данных (думаю что нет)?
  • Вопрос задан
  • 1721 просмотр
Решения вопроса 1
leahch
@leahch
3D специалист. Dолго, Dорого, Dерьмово.
Посоветую elasicsearch. Закидывайте в него свои данные (в вашем случае подойдет и logstash). Индексы бейте или на месяцы или на недели, организуйте их по годам/месяцам/дням через алиасы. Отчеты можете делать или через kibana, или сами дергать агрегированные данные из своих приложений. Индексы удобно ротировать, архивировать и удалять старые.
И будет щазтие.
Ну и да, если у вас только аналитика этих данных, то мускул здесь совсем не нужен!
Ответ написан
Пригласить эксперта
Ответы на вопрос 5
@asd111
Берите яндекс clickhouse. Он как раз для отчетов и больших объемов и запросы идут напрямую. С ним можно искать по миллиарду записей за 5-20 секунд(core i5, ssd, 16Gb RAM). Для построения отчетов приемлемое время.
https://clickhouse.yandex/
Ответ написан
Комментировать
sim3x
@sim3x
Зачем raw-data вообще хранится в мускуле?

Такое нормально скидывается в текстовик и жмется архиватором

А в мускул кладется инфа в 3NF
Тогда и запросы будут идти секунды (на адеквктном железе и настройках)
Ответ написан
@lega
Я уже на тостере пару раз описывал одно из решений (с расчетом на прирост до 2000 млн записей в день), в кратце:
* таблицы на свалку, нужно паковать чанками (например чанк - 1 час/день данных в разрезе раздела) с индексами в доль разрезов, можно использовать nosql (mongodb с шардингом, хотя вам и одного сервера наверно хватит)
* чанки паковать (экономия до 95% места)
* далее после завершения периодов запускаются задачи которые наполняют "кеш" - строят отчеты во всех разрезах + промежуточные результаты, что-бы пользователю выдавать результат моментально когда он кликает по интерфейсу.

я делал решение на питоне, там где расчет занимал длительное время - делал с++ вставки, в результате расчет выполнялся в ~ х70 раз быстрее, и питон прокачивал более 10млн записей в сек. в один поток с учетом выкачивания из БД
Ответ написан
Комментировать
Supme
@Supme
Просто системный администратор
Так этож метрики. Influxdb, Prometeus, ClickHouse и тп
Ответ написан
Комментировать
@santaatnas
Java, Python, Php
Смотрите в сторону Hadoop и/ или Clickhouse и будет вам счастье.
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы