оптимизация запроса count (distinc ())

sickboy

Новичок
оптимизация запроса count (distinc ())

Hi,
Есть вот такой запрос:

[SQL]SELECT COUNT(long_ip) AS hits, COUNT(DISTINCT long_ip) AS hosts FROM counter;[/SQL]

изначально он выполнялся (0.22 sec), при количестве строк всего в 20к.

потом я преобразовал хранение IPv4 как int, время запроса сократилось до 0.13 с.

если к такому запросу добавить еще и WHERE, т.е.:
[SQL]SELECT COUNT(long_ip) AS hits, COUNT(DISTINCT long_ip) AS hosts FROM counter WHERE long_ip<>'166762165' AND long_ip<>'167775161' AND long_ip<>'-1020642095' AND long_ip<>'1348732835';[/SQL]
то получаю 0.19 sec, но таких запросов приходится делать несколько, плюс еще в WHERE добавляются условия по дате.

Вот собственно сама таблица:
[SQL]| counter | CREATE TABLE `counter` (
`id` int(10) NOT NULL auto_increment,
`long_ip` int(10) NOT NULL,
`uri` varchar(255) NOT NULL,
`refer` text NOT NULL,
`agent` varchar(255) NOT NULL default '',
`unix_time` int(10) NOT NULL,
PRIMARY KEY (`id`),
KEY `long_ip` (`long_ip`),
KEY `agent` (`agent`),
KEY `url` (`uri`),
KEY `unix_time` (`unix_time`)
) ENGINE=MyISAM DEFAULT CHARSET=koi8r |[/SQL]

можно ли еще как то оптимизировать запросы/таблицу?
 

zerkms

TDD infected
Команда форума
плюс еще в WHERE добавляются условия по дате.
если условия на дату и ИП будут в запросе одновременно и объединены логическим AND, то вместо индекса на long_ip сделай составной индекс long_ip_unix_time

ps:
[sql]
WHERE long_ip NOT IN(166762165, 167775161, -1020642095, 1348732835);
[/sql]
pps: сделай long_ip unsigned
ppps: если индексы для url и agent тебе не нужны - то также удали и их
 

sickboy

Новичок
Автор оригинала: zerkms
если условия на дату и ИП будут в запросе одновременно и объединены логическим AND, то вместо индекса на long_ip сделай составной индекс long_ip_unix_time

ps:
[sql]
WHERE long_ip NOT IN(166762165, 167775161, -1020642095, 1348732835);
[/sql]
pps: сделай long_ip unsigned
такой запрос выполняется теперь не 0.19 а 0.14 sec, с датой я пока что не эксперементировал.

а ожидается ли уменьшение времени при использование беззнаковых long_ip? и с чем это связано?
 

zerkms

TDD infected
Команда форума
sickboy
не уверен, будет ли быстрее, но будет по крайней мере логичнее.
 

sickboy

Новичок
zerkms
к сожалению не вижу причины, почему бы это было логичнее.
Поясните пожалуйста.
 
Сверху