Грамотное хранение статистики, и работа с ней при большой посещаемости?

Добрый день уважаемые!

Не так давно для сайта реализовал скромную статистику учета просмотров новостей. Для хранения использую MySQL.
В итоге у меня получилась довольно таки простая таблица:

CREATE TABLE `developers_stat` (
  `news_id` int(20) DEFAULT NULL,
  `date` date DEFAULT NULL,
  `views` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

В итоге имеем: количество просмотров новостей за каждый день любого месяца и года.

news_id | date | views
4285 | 2016-12-29 | 8258
4285 | 2016-12-10 | 10698
4285 | 2016-12-11 | 10989
4285 | 2017-01-02 | 11735
4285 | 2017-01-07 | 11253

Далее вывожу статистику в админке.
Всего, За последние 30 дней, За текущую неделю, За вчера, За сегодня.

5266c7f1423845e0bd55016bb44a945c.png
Сейчас в базе 564 627 строк и это только за 3 месяца.

При обновлении просмотров:
$readcount_stat = $db->super_query( "SELECT count(*) as count FROM developers_stat WHERE news_id='{$row['id']}' AND date='{$today}'" );

if( !$readcount_stat['count'] ) {
    $db->query( "INSERT INTO developers_stat (news_id, date, views) VALUES ('{$row['id']}', '{$today}','1')" );
}else{
    $db->query( "UPDATE developers_stat SET views=views+1 WHERE news_id='{$row['id']}' AND date='{$today}'" );
}

Посещаемость сайта примерно 70 000 и при каждом просмотре идет запрос в БД (SELECT count(*) и UPDATE), и так для каждого просмотра. Что есть нагрузка на сервер.

Как порекомендуете более грамотно хранить такую статистику?

Пока что я вижу только один вариант, это хранение общей статистики в отдельной таблице
news_id | total_views
4283 | 301894
4284 | 380036
4285 | 250481

А в текущей таблице оставить только за текущий месяц,
news_id | date | views
4283 | 2017-01-02 | 11735
4283 | 2017-01-03 | 12248
4284 | 2017-01-04 | 11804

по истечении которого запускать скрипт через крон, и переносить значения в общую таблицу и складывать с теми значениями. А текущую обнулить, и начать месяц заново.
Но это сократит объем данных, но не саму нагрузку.

Буду рад вашим советам и критике.
Спасибо.
  • Вопрос задан
  • 1540 просмотров
Решения вопроса 1
dimonchik2013
@dimonchik2013
non progredi est regredi
Yandex Clickhouse

+ архив / аггрегирование за старые периоды (прошлый позапрошлый год и т.п.)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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