Добрый день уважаемые!
Не так давно для сайта реализовал скромную статистику учета просмотров новостей. Для хранения использую 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 дней, За текущую неделю, За вчера, За сегодня.
Сейчас в базе 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
по истечении которого запускать скрипт через крон, и переносить значения в общую таблицу и складывать с теми значениями. А текущую обнулить, и начать месяц заново.
Но это сократит объем данных, но не саму нагрузку.
Буду рад вашим советам и критике.
Спасибо.