Adam_Ether
@Adam_Ether
Java Developer

Агрегация статистики в SQL-хранилище?

Предложите вашу реализацию задачи.

Допустим существует система, которая собирает определенную статистику с округлением до минуты. Пускай формат такой: date, count.

Хранится это все в sql-storage (postgresql или mysql).

Вопрос как агрегировать эту статистику в:

1) статистику по часам,

2) статистику по дням.


Требования:

1) обрабатывать только новые данные, т.е. инкрементальным методом.

2) обеспечить максимальное быстродействие

3) по возможности низкое потребление RAM и CPU.


Существует вариант решения задачи при помощи создания views в бд. С запоминаем последней обработанной даты. И не самым элегантным мержом конфликтов статистики.

Думал забирать статистику в MongoDB и там делать map-reduce. Потом обратно в sql-storage. Но это использовании сразу двух разных БД. Накладные ресурсы на копирование. Что выглядит тоже, не самым подходящим способом.
  • Вопрос задан
  • 4607 просмотров
Решения вопроса 1
Stdit
@Stdit
Вариант с map-reduce — не факт, что будет более быстродействующим решением. Поможет денормализация. Чтобы избежать агрегации на каждом запросе статистики, и ударных нагрузок на процессор и память во время таких запросов, логично во время занесения каждой очередной записи увеличивать счетчики, находящиеся в специальных таблицах. Для этого на вставку можно поставить триггер, инкрементирующий нужный счетчик (счетчик текущего часа, счетчик текущего дня). Разумеется, под каждую форму статистического запроса потребуется отдельный счетчик.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@egorinsk
Явно в приложении увеличивать счетчики. В MySQL это можно делать одним запросом вроде:

INSERT INTO hourly_table() VALUES() ON DUPLICATE KEY UPDATE x = x + ?, y = y +?
INSERT INTO daily_table() VALUES() ON DUPLICATE KEY UPDATE x = x + ?, y = y +?
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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