очень долго выполняются запросы в БД

Статус
В этой теме нельзя размещать новые ответы.

clevel

Новичок
очень долго выполняются запросы в БД

таблица statistic (пишу статистику):
owner(int(10) unsigned),
user(int(10) unsigned),
page(int(10) unsigned),
hit(int(10) unsigned),
exec (int(10) unsigned)
index owner,user,page,hit
запрос:
SELECT FROM_UNIXTIME(statistic.hit,'%Y%m'),COUNT(DISTINCT(copy.user))
FROM statistic,statistic copy
WHERE statistic.owner=2
AND copy.owner=statistic.owner
AND FROM_UNIXTIME(copy.hit,'%Y%m')<FROM_UNIXTIME(statistic.hit,'%Y%m')
AND statistic.user=copy.user
GROUP BY 1
ORDER BY statistic.hit
с индексом выполняется 6 секунд, без оного - 15 секунд... именно этот запрос тормозит...


Explain:
table type possible_keys key key_len ref rows Extra
statistic ref owner owner 4 const 114 where used; Using index; Using temporary; Using filesort
copy ref owner owner 8 const,statistic.user 114 where used; Using index
 

Crazy

Developer
Избавляйся от "FROM_UNIXTIME(copy.hit,'%Y%m')<FROM_UNIXTIME(statistic.hit,'%Y%m')" -- обращение к функции не дает полноценно использовать индексы.

И не мог бы ты пояснить смысл своего запроса?
 

chira

Новичок
объясни что ты хочешь посчитать своим запросом, чего-то не очень понятно, вернее совсем не понятно
 

Crazy

Developer
Для начала занеси результат выполнения этой функции как поле в базу и построй по нему индекс. Делать же индекс по hit для твоего запроса бессмысленно...
 

Crazy

Developer
Двое нас. Я тоже, к стыду своему, не понял, почему все сделано именно так...
 

RomikChef

Guest
FROM_UNIXTIME(copy.hit,'%Y%m')<FROM_UNIXTIME
этот запрос выводит номера пользователей прошлых месяцев...
Не понял. у тебя хит - это номар пользователя в формате юникс таймстамп?
А ты не пробовал как-то менее коряво юзеров именовать?
 

clevel

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

clevel

Новичок
Избавляйся от "FROM_UNIXTIME(copy.hit,'%Y%m')<FROM_UNIXTIME(statistic.hit,'%Y%m')" -- обращение к функции не дает полноценно использовать индексы.
как прикажешь это сделать?
дополнительное поле с месяцем и годом не рационально - у меня статистика не только по месяцам, но и по часам, дням недели и месяца... будет избыточное хранение данных...
 

clevel

Новичок
всего 2200 примерно, по данному owner 1200... по другим owner, где записей 30-50 все летает... а тут :((
 

clevel

Новичок
owner=владелец сайта, сна котором установлена статистика...
user - посетитель этого сайта...
кстати,RomikChef, сенкс за топик с файлами, за поддержку
 

si

Administrator
2200 x 2200 сколько будет ? ~5*10^6 вот вам и тормоза.

сделайте EXPLAIN SELECT ... и челультат покажите ?
 

clevel

Новичок
Вот это уже лишнее ...
Что, благодарности нынче не в моде? Просто помню недавно какие-то все грубые были, не давали расслабиться...
дельных советов не дали, зато обругали... до сих пор осадок остался... а тут человек заступился, когда другие понесли...
по моему заслуживает благодарности...
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху