Я бы порекомендовал это:
Используйте интергеры вместо символов / вариантов. таким образом, вы индексируете быстрее (кроме реферера). Также могу порекомендовать получить сводные таблицы. Хотя это не совсем нормализовано, но запрос будет выполнен мгновенно, особенно если у вас большая организация с большим трафиком.
Итак, вот таблицы:
create table statistics (
browser tinyint(3) UNSIGNED not null default 0,
version float(4,2) not null default 0,
ip INT(10) UNSIGNED not null default 0,
createdon datetime,
referrer varchar(5000),
key browserdate (browser, createdon),
key ipdate (ip, createdon),
// etc..
);
browser 0 = неизвестно, 1 = firefox и т. Д. Это можно сделать в вашем коде (поэтому вы загружаете один и тот же код для вставки и выбора). я не использую enum здесь, потому что, если вам нужно изменить таблицу, и у вас есть миллионы записей, это может быть больно. новый браузер = новый номер в коде, который быстрее меняется.
эта таблица может использоваться для пересчета всех остальных таблиц, если что-то случится. поэтому вы создаете индекс для встроенной сводной таблицы (пример браузера)
Теперь в сводной таблице:
create table statistics_browser_2011_11 (
browser tinyint(3) UNSIGNED not null default 0,
version float(4,2) not null default 0,
number bigint(20) not null default 0,
createdon datetime,
unique key browserinfo (createdon, browser, version)
); // browsers stats for november 2011
Таким образом, когда вы вставляете (вы получаете дату пользователя, когда он зашел на сайт и создаете строку $, совпадающую с именем таблицы) в эту таблицу, вы должны использовать только on duplicate key number = number +1
. таким образом, когда вы получаете статистику браузера, это очень быстро.
теперь здесь вам нужно будет создать таблицу слияния, потому что, если вы являетесь вторым месяцем и хотите запросить последние 7 дней, вам понадобится таблица текущего месяца и последнего месяца. вот больше информации: http://dev.mysql.com/doc/refman/5.1/en/merge-storage-engine.html
и вы повторяете процесс для получения другой информации: ip, реферер и т.д ...
Чтобы сохранить эти таблицы, вам нужно создать cronjob, который будет создавать таблицы на следующий месяц. простой скрипт PHP, который получает текущий год / месяц, а затем создает таблицу на следующий месяц, если она не существует, а затем объединяет их)
это может быть немного работы, но это то, как я делаю это на работе (с аналогичными данными) с 12 терабайтами данных и 5000 сотрудников, которые выбирают базы данных. мое среднее время загрузки для каждого запроса составляет около 0,60 секунд на запросы.