Другое предложение:
Когда пользователь заходит на ваш сайт, зарегистрируйте свой IP-адрес в таблице и отправьте cookie с уникальным идентификатором. Сохраните этот уникальный идентификатор в таблице вместе со ссылкой на запись IP-адреса. Таким образом, вы сможете рассчитать более точный счет (и внести коррективы в ваш окончательный номер)
Настройте автоматическое задание для создания сводных таблиц, что значительно ускоряет запрос данных. Это также позволит вам регулярно сокращать данные.
Если вы готовы пожертвовать лучшей точностью, то это может быть решением:
Это будет таблица «хранения», которая содержит необработанные данные. Это не та таблица, из которой вы будете запрашивать данные, а просто запись. Вы бы проходили всю эту таблицу ежедневно / еженедельно / ежемесячно. Еще раз - вам могут понадобиться индексы в зависимости от того, как вы хотите сократить это.
CREATE TABLE `article_views` (
`article_id` int(10) unsigned NOT NULL,
`doy` smallint(5) unsigned NOT NULL,
`ip_address` int(10) unsigned NOT NULL
) ENGINE=InnoDB
Тогда у вас будет сводная таблица, которую вы будете обновлять ежедневно, еженедельно или ежемесячно, что будет очень быстро запрашивать.
CREATE TABLE `summary_article_uniques_2011` (
`article_id` int(10) unsigned NOT NULL,
`doy` smallint(5) unsigned NOT NULL,
`unique_count` int(10) unsigned NOT NULL,
PRIMARY KEY (`article_id`,`doy`),
KEY(`doy`)
) ENGINE=InnoDB
Примеры запросов:
Уникальный счет для конкретной статьи в день:
SELECT unique_count FROM summary_article_uniques_2011 WHERE article_id=? AND doy=" . date('z') . "
Количество дней в сутки для конкретной статьи:
SELECT unique_count FROM summary_article_uniques_2011 WHERE article_id=?
Подсчитывает по всему сайту, самые популярные статьи сегодня:
SELECT article_id FROM summary_article_uniques WHERE doy=? ORDER BY unique_count DESC LIMIT 10 // note this query will not hit an index, if you are going to have a lot of articles your best bet is to add another summary table/index "unique_count"