Имя: Пароль:
IT
 
Помогите оптимизировать запрос
0 moneyget
 
08.06.14
21:40
Добрый день

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


SELECT p.*, up.imageurl as avatar, u.login as userlogin, u.nickname as nickname,
(SELECT COUNT(ap.id) FROM cms_freelance_aps ap LEFT JOIN cms_users au ON au.id = ap.user_id WHERE ap.project_id = p.id AND au.is_deleted = 0 AND au.is_locked = 0) as enrcount,
(SELECT COUNT(ad.id) FROM cms_freelance_aps ad WHERE ad.project_id = p.id) as added
FROM cms_freelance_projects p
LEFT JOIN cms_users u ON u.id = p.user_id
LEFT JOIN cms_user_profiles up ON up.user_id = p.user_id
LEFT JOIN cms_freelance_aps a ON a.project_id = p.id
WHERE p.published <> -1 AND u.is_deleted = 0 AND u.is_locked = 0
GROUP BY p.id
ORDER BY p.published DESC, p.id DESC


Если убрать

GROUP BY p.id
ORDER BY p.published DESC, p.id DESC

все ок, работает быстро, если убрать только одну из этих строк, тупит. Т.е. проблема в них.


Благодарю всех откликнувшихся.
1 Necessitudo
 
08.06.14
21:49
А если все без группировки и сортировки поместить во временную таблицу, проиндексировав ее по полям группировки-сортировки, а потом уже и сделать сии действия на данных временной таблицы?
2 sda553
 
08.06.14
22:06
У тебя какой то из джойнов тупит.
Сверху (временно) в селекте оставь только p.*
И потом эти лефт джойны все закомменть. Если скорость ок(а иначе странно), то раскомментивай по очереди и смотри, кто затупил
3 moneyget
 
08.06.14
22:11
тупит
LEFT JOIN cms_freelance_aps a ON a.project_id = p.id
4 moneyget
 
08.06.14
22:15
даже не пойму зачем он ))) без него строк столько же, и количество полей тоже