Kolega posiada serwis (hosting zdjęć) robiony na zamówienie, jednak poprawiam pewne niedoróbki, mianowicie dziś stanęło na zapytaniu, które na serwerze nazwa.pl wykonuje się .. 15 sekund. Za pomocą tego zapytania udało mi się skrócić czas wykonania zapytania do ~0,9 sekundy.
SELECT u.id, u.username, u.registered, u.use_avatar, COUNT(z.id) AS ilosc_zdjec, ROUND(AVG(o.ocena),1) AS srednia FROM forum_users u JOIN tbl_zdjecia z ON u.id = z.user_id JOIN tbl_oceny o ON u.id = o.target_owner WHERE u.id > 1 GROUP BY u.id
i teraz tak:
Są 3 tabele: forum_users - gdzie jest większość danych o użytkowniku, tbl_zdjecia - czyli informacje o zdjęciach oraz tbl_oceny - czyli oceny wystawiane zdjęciom.
Zasadniczo zapytanie to pobierać ma id, nazwę użytkownika, datę rejestracji (u.registered), avatar (u.use_avatar), dodatkowo ma zliczać ilość zdjęć danego użytkownika (z.id) oraz wyliczać średnią ocen - do tego użyłem round w celu zaokrąglenia i avg.
Target_owner to oczywiście id użytkownika w tabeli tbl_oceny.
To moje pierwsze doświadczenia ze złączeniami (w końcu je zaczynam rozumieć), jednak zapytanie przy tych 3 tabelach ciągle wykonuje się lekko poniżej 1 sekundy - czy jest jakaś szansa na większą optymalizację? Ktoś z was ma jakieś sugestie?
Wcześniej obliczanie średniej było wykonane zagnieżdżonym SELECTem.