Проблема с запросом

Benderlio

Новичок
Запрос такой

SELECT shop.* FROM shop
join city on (shop.city=city.city_id)
join region using (region_id)
join shop_cat on using (id_shop)
where shop.state=1 and shop_cat.id_cat>0
group by shop.id_shop
ORDER BY shop.pay DESC limit 10

Анализ
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE shop_cat range id_shop,id_cat id_cat 4 NULL 130282 Using where; Using temporary; Using filesort
1 SIMPLE shop eq_ref PRIMARY,state,city PRIMARY 4 guru_shop_temp.shop_cat.id_shop 1 Using where
1 SIMPLE city eq_ref PRIMARY,region_id PRIMARY 4 guru_shop_temp.shop.city 1
1 SIMPLE region eq_ref PRIMARY PRIMARY 4 guru_shop_temp.city.region_id 1

Отрабатывает 5 секунд. Индексы по всем связям стоят. убираю group by shop.id_shop - уменьшается до 1 сек. Подскажите как оптимизировать. Спасибо.
 

iceman

говнокодер
Benderlio
с начало группируй, потом режь и сортируй, в под запросах. у тебя просто данных дохренище видать
 

Benderlio

Новичок
prolis
да это необходимое условие или shop_cat.id_cat!=0

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

iceman

говнокодер
Benderlio
сколько записей будет - если убрать группировку или лимит? - цифру в студию.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Benderlio
тормоза, видимо, из-за filesort using temporary

можно попробовать поиграть, указав руками порядок исполнения запросов,
все-таки mysql бывает жутко тупит
 

dadoc

Новичок
А как быстро выполняеться запрос с SELECT shop.id_shop FROM ... ?

И зачем джойнятся city c region если они не используются?
 

Benderlio

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

Benderlio

Новичок
Chusha
shop.id_shop - уникальный, но у меня несколько shop_cat_id соответствует одному id_shop если убрать group by то повторяются записи
индекс на shop.pay есть с самого начала
 

Benderlio

Новичок
Chusha
запустил ваш запрос, в результате один и тот же магазин 10 раз поскольку находится в 10 разных категориях.
 

Benderlio

Новичок
Chusha
ох, большое спасибо
этот вариант работает просто отлично

SELECT shop.* FROM shop
where shop.state = 1 and exists(select id_cat from shop_cat where shop_cat.id_shop = shop.id_shop and shop_cat.id_cat > 0)
ORDER BY shop.pay DESC limit 10
 
Сверху