хранение статистики посещений

berkut

Новичок
хранение статистики посещений

Есть н-ое кол-во страниц, для каждой из них нужно вести статистику посещений: всего, месяц, день. Как оптимально это организовать? Хранить статистику за каждый день в течении месяца и каждый день скидывать информацию, которая старше месяца в отдельную таблицу - оччень не оптимально. Таблица раздуется до немыслимых размеров
 

Romashov

экспериментатор
Зачем скидывать в какую-ту другую таблицу?
день | страница | количество посещений

В год 365хN записей.
Разве это "немыслимый размер"?
 

berkut

Новичок
что-то типа форума
5000 "страниц" == 182500 записи только за год
при относительно небольшой посещаемости будут огромные тормоза. update where страница and date + зловещий sum
 

Romashov

экспериментатор
Если форум, то тебя разве имеет значение сколько раз была просмотрена статистика N такого-то числа прошлого года?
Наверняка тебе нужны агрегированные данные, поэтому частью информативности можно пожертвовать.
 

Steamroller

Новичок
Re: хранение статистики посещений

Автор оригинала: berkut
Хранить статистику за каждый день в течении месяца и каждый день скидывать информацию, которая старше месяца в отдельную таблицу - оччень не оптимально. Таблица раздуется до немыслимых размеров
Да нормально это.
Если 5000 страниц, то на 30 дней - 150 тыс. записей, причем записи маленькие - там по сути три 4-байтовых поля. Активно в течение дня из них будет всего 5000 записей использоваться (т. е. находиться в буферах, а не лежать никому не мешая на диске), и раз в день - по этим 5000 записям один "тяжелый" запрос пройдет.
А агрегированные цифры - прямо по ходу дела можно считать, тогда не надо суммировать для просмотра статистики.
 

magic

lancer
Все зависит от того, что именно нужно.

Какие будут отчеты? Подробнее...
 

berkut

Новичок
Нужно выводить статистику посещения для каждой отдельной страницы за месяц, текущий день, всего. У каждой страницы есть автор, у одного автора

страниц может-быть несколько, нужно ещё выводить статистику (только для автора) - общее кол-во просмотров всех его страниц.

Я вот думаю может сделать так: завести 2 таблицы,
1 - кол-во просмотров "всего", за исключением последних 30 дней +
кол-во просмотров за последние 30 дней,
за исключением текущего дня(views: page - total - month) ~5000 записей
2 - кол-во просмотров за _каждый_ день, в течении последних 30 дней.
(days: page - date - quantity) PRIMARY KEY(page, date)
Тогда на пхп будет всё выглядеть так, при просмотре страницы:
1) Дёргаем статистику за текущий день, из таблицы на ~150000 записей,
с выборкой
SELECT quantity FROM days WHERE page = $current_page AND date = $current_date
Если вернуло 0 рядов, значит статистики на сегодня нет, тогда {
//этот блок выполнится только 1 раз в сутки
INSERT INTO days (page,date,quantity) VALUES ($current_page, $current_date, 1);
$minus_amount = `SELECT quantity FROM days WHERE page = ? AND date = ($current_date-31 день)`
$plus_amount = `SELECT quantity FROM days WHERE page = ? AND date = ($current_date-1 день)`
UPDATE views SET month=month-($minus_amount+$plus_amount), total=total+$minus_amount
DELETE FROM days WHERE page = ? AND date > ($current_date-30 дней)
}
+ ещё запрос для вывода статистики:
SELECT month, total FROM views WHERE page = ?
Результаты 2-х запросов суммируем. В плане просмотра страниц вроде как бодренько получается, только проблема
с общим кол-ом посещений страниц, принадлежащих 1-му автору, но такие запросы относительно редки.
Можно использовать SUM + завести поле с датой последнего обновления. Что скажите? фтопку?
 

Romashov

экспериментатор
Для каждой страницы 3 поля - сегодня, месяц, всего.
При просмотре увеличиваешь количество `сегодня` на единицу.
В 23:59:59 значения за `сегодня` плюсуешь к `месяцу` и обнуляешь.
1 числа каждого месяца плюсуешь `месячные` данные к `всего` и обнуляешь.

Надо узнать сколько всего - запроси из БД сумму по трём полям.
Для автора - пожалуйста, сумма трёх полей по всем его публикациям.
В базе лежит только таблица страниц.

-~{}~ 17.11.05 16:16:

с общим кол-ом посещений страниц, принадлежащих 1-му автору, но такие запросы относительно редки.
Можно использовать SUM + завести поле с датой последнего обновления. Что скажите? фтопку?
ты нагородил. фтопку.
 

berkut

Новичок
Romashov Предложенный тобою вариант не подходит. Нужна статистика за _последний_ месяц, т.е. не календарный месяц, а за _последние_ 30 дней, я писал об этом
 

Steamroller

Новичок
Так заведи ещё одно поле - за вчера. И в полночь вычитай из месяца поле "вчера" и добавляй поле "сегодня".
 

berkut

Новичок
Steamroller и что за чертовщина получится? Это не будет статистикой за последние 30 дней. Каждый день нужно отнимать кол-во посещений, которое было 31 день назад - тогда будет статистика за 30 дней
 

magic

lancer
Ну так пиши все обращения в лог и один раз в день запускай скрипт, который будет все суммировать и обновлять всю статистику. В чем проблема?
 

berkut

Новичок
magic если я буду вести лог за день, то я не смогу вычислять кол-во посещений за последние 30 дней(см. 2 поста выше), и мне ещё нужно выводить статистику за текущий день. алё! кто-нибудь вообще читает постановку задачи, или лишь-бы что-нибудь написать
 

Steamroller

Новичок
Steamroller и что за чертовщина получится? Это не будет статистикой за последние 30 дней. Каждый день нужно отнимать кол-во посещений, которое было 31 день назад - тогда будет статистика за 30 дней
И точно, что-то переклинило меня. :)
Ну значит надо хранить таблицу в которой по дням вся статистика за последние 30 дней.
 

berkut

Новичок
>> Steamroller Ну значит надо хранить таблицу в которой по дням вся статистика за последние 30 дней

абалдеть :) где-то это я уже слышал. наверно здесь http://phpclub.ru/talk/showthread.php?postid=544709#post544709
 

berkut

Новичок
Steamroller а зачем ты пишешь в топик, который не читаешь?
У этого решения есть по крайней мере 1 жирный минус - проблемно считать общее кол-во посещений страниц одного автора. Вот я хочу, что-бы кто-нибудь посоветовал более грамотное решение.
 

Steamroller

Новичок
Steamroller а зачем ты пишешь в топик, который не читаешь?
Я прочитал! все кроме конкретно того твоего поста (тот с первого раза не осилил из-за объема). :)
У этого решения есть по крайней мере 1 жирный минус - проблемно считать общее кол-во посещений страниц одного автора.
А в чем проблема-то? Фильтруешь id страниц автора, джойнишь на таблицу со статистикой, суммируешь quantity. Запрос сам по себе не из тяжелых, но если даже тормозить начнет - без проблем оптимизируется, например добавлением идентификатора автора в таблицу статистики и созданием индекса (автор, дата, количество).
 
Сверху