Скорость выборки и др.

Xaoc

Новичок
Скорость выборки и др.

Вопросы у меня такие. Делаю счетчик посещений, который собирает статистику в MySQL. Каждый
хит - это новая запись в таблицу. Как выводить общее кол-во хитов я уже нашел в архивах
форума:
SELECT COUNT(*) FROM table

Вот. А если в таблице в конце концов будет больше 1000000 записей, то все ли будет нормально с MySQL при SELECTе например хитов за определенные периоды времени? Будет ли сильно тормозить когда будет открываться порядка 1000 страниц в секунду ну и на каждую надо выводить счетчик, который будет отбирать хиты и хосты за сегодня (SELECTом)? И какого размера может быть таблица если её всю записать в прямоугольный массив (чтоб еще не грохнулся PHP)?
 

Demiurg

Guest
на самом деле лучше класть первоначально в файл и в отдельную таблицу а потом раз в час/полчаса/день вытаскивать данные в твою основную таблицу (скорее всего это уже будут какието статестические данные а не просто клики). В этой основной табшице уже быдут настроены индексы и прочее, для нормальной работы.

ps 1000 страниц в секунду - это конечно хорошо, это где у тебя такая посещаемость ?
 

Кром

Новичок
Xaoc, если у тебя в планах делать что то наподобие сайта статистики, тебе нужно не в архивах phpcluba рыться, а прямиком идти на mysql.ru и читать там про индексацию/оптимизацию таблиц.
Если все сделать правильно, ничего тормозить не будет.
 

Falc

Новичок
В файл это конечно быстро, но по мойму это лишний гимор.
Индексы в таблицке правильно проставить и никаких тормозов не будет.
Еще надо статистику чистить. например врядли кому понадобиться почасовая разбивка за какое-то число прошлого года :)
 

Demiurg

Guest
>Индексы в таблицке правильно проставить и никаких тормозов не будет.
ага , посмотрю я как у тебя будет раз в секунду апдейтится вся таблица с индексами в 1000 000 записей.
 

Falc

Новичок
Сервер P2 450 Линукс
MYSQL 4.0.13

Таблица "test": 4,340,974 записей

CREATE TABLE `test` (
`user_id` tinyint(3) unsigned NOT NULL default '0',
`task_id` smallint(5) unsigned NOT NULL default '0',
`type` enum('manager','creator','tester','viewer') NOT NULL default 'manager',
KEY `user_id` (`user_id`),
KEY `user_id_2` (`user_id`),
KEY `task_id` (`task_id`)
) TYPE=MyISAM COMMENT='Участие пользователей в задачах';


[SQL]
INSERT INTO `test` ( `user_id` , `task_id` , `type` )
VALUES (
RAND( ) * 255, RAND( ) * 10000, 'tester'
)
[/SQL]
Время выполнения запроса: 0.0010 - 0.0300 sec
 

Xaoc

Новичок
Ну хорошо, убедили! :)

А вот сможете мне помочь с правильной табличкой? Ну типы данных такие, при которых все издержки будут по минимуму?
Предположительно таблица должны состоять из ID собственно и из 9 доп. полей: IP, ОС, броузер, разрешение, глубина цвета, язык, город-страна, время посещения (в секундах с 1970 года) и включен ли яваскрипт. Вот с ID бы разобраться!.. ОС, броузер, разрешение, язык, город-страна и яваскрипт - это можно varcharами, а глубину и дату уже INT. Как лучше записать IP?
 

Falc

Новичок
Originally posted by Xaoc
Ну хорошо, убедили! :)

А вот сможете мне помочь с правильной табличкой? Ну типы данных такие, при которых все издержки будут по минимуму?
Предположительно таблица должны состоять из ID собственно и из 9 доп. полей: IP, ОС, броузер, разрешение, глубина цвета, язык, город-страна, время посещения (в секундах с 1970 года) и включен ли яваскрипт. Вот с ID бы разобраться!.. ОС, броузер, разрешение, язык, город-страна и яваскрипт - это можно varcharами, а глубину и дату уже INT. Как лучше записать IP?
IP - это 4 байта, следовательно int
Дату лучше хранить в виде даты :)
Если ты будешь ОС, броузер, разрешение, язык, город-страна и яваскрипт варчарами записывать у тебя никакого места на винте не хватит :)
Делай справочники.
На ОС, Браузер, язык, яваскрипт скорее всего тебе хватит tinyint
на город-страна - скорее всего int хотя может хватит и smallint
 
Сверху