Помогите с SQL запросом

WF
На сайте с 12.07.2010
Offline
17
634

Есть табличка в которую пишутся логи:

CREATE TABLE `log`
(
`IP` varchar(16) NOT NULL,
`REFFER` varchar(2000) default NULL,
`REFFER_HOST` varchar(2000) default NULL,
);

Записи в ней примерно такие:

127.0.0.1 | http://yandex.ru/search?... | yandex.ru

127.0.0.1 | http://yandex.ru/blablab?... | yandex.ru

127.0.0.1 | http://google.com/sss?... | google.com

И запрос, который определяет с какого сайта ко мне больше всего приходят посетителей (домен, уник. посетитель, просмотры):

SELECT `REFFER_HOST` as `STR`,COUNT(DISTINCT IP) as `VISITS`,COUNT(*) as `HITS` FROM `log` GROUP BY `REFFER_HOST` ORDER BY `HITS`

Нужно оптимизировать таблицу - убрать `REFFER_HOST` и изменить запрос, чтобы имя домена определялось прямо в нем.

Возможно ли это сделать?

Subudayj
На сайте с 24.06.2008
Offline
67
#1

Если у вас MySQL, попробуйте как-нибудь так:

SELECT SUBSTRING(REFER_HOST, 8, INSTR(SUBSTRING(REFER_HOST , 8), '/') - 1) as `STR`, COUNT(DISTINCT IP) as `VISITS`,COUNT(*) as `HITS` FROM `log` GROUP BY SUBSTRING(REFER_HOST, 8, INSTR(SUBSTRING(REFER_HOST , 8), '/') - 1) ORDER BY `HITS`

Quo vadis?
dvaes
На сайте с 03.09.2007
Offline
65
#2

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

Subudayj
На сайте с 24.06.2008
Offline
67
#3

Упс, опечатался.

Вот так:

SELECT SUBSTRING(REFFER, 8, INSTR(SUBSTRING(REFER , 8), '/') - 1) as `STR`, COUNT(DISTINCT IP) as `VISITS`,COUNT(*) as `HITS` FROM `log` GROUP BY SUBSTRING(REFFER, 8, INSTR(SUBSTRING(REFFER, 8), '/') - 1) ORDER BY `HITS`

S
На сайте с 14.04.2008
Offline
60
#4

WEBAFF,

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

WF
На сайте с 12.07.2010
Offline
17
#5

Всем спасибо, я уже отказался от этой идеи. Оставил как было, так реально быстрее и удобнее.

[Удален]
#6

varchar(2000)

а еще читайте документацию. http://dev.mysql.com/doc/refman/5.0/en/char.html

Values in VARCHAR columns are variable-length strings. The length can be specified as a value from 0 to 255
N
На сайте с 06.05.2007
Offline
419
#7

а дата посещения не записывается что-ли? первичный индекс тоже отрицаете?

если запрос критичный, то можно сразу при вставке хранить и учитывать в отдельной таблице (ид_хоста int, имя хоста varchar, число_записей int). индексы : primary key ид_хоста, обычный на число_записей

Кнопка вызова админа ()

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий