mysql optymalizacja zapytania rest api

0

Czesc napisalem rest api w slim framework 3 i mam taki problem, gdy w api wywoluje zaptanie

SELECT * from ads;

api zwraca zapytanie w jsonie w czasie ok 60ms
w phpmyadmin wykonuje w 0.0014s
gdy ustalam docelowe zapytanie:

select distinct
ads.id,ads.user_id,(SELECT count(saved_ads.user_id) from saved_ads WHERE saved_ads.ad_id = ads.id AND saved_ads.user_id = ?) AS subscribe,us.name as userName,cat.name as categoryName,cit.name as cityName,ads.logo,ads.title,ads.description,ads.lat,ads.lon,ads.visits,ads.active,ads.created_at FROM ads INNER JOIN users as us on us.id=ads.user_id INNER JOIN categories as cat on cat.id = ads.category_id INNER JOIN cities as cit on cit.id=ads.city_id WHERE ads.active = '1' AND reviewed = '1' ORDER BY ads.created_at DESC LIMIT ? OFFSET ?;

to api zwraca wyniki w ok 120-150ms (w phpmyadmin Wykonanie zapytania trwało 0.0031 sekund)
w tabeli ads mam okolo 20 wierszy
w category ok 30
w cities ok 600
a w users 40
w jaki sposob zoptymalizowac zapytanie , zeby zejsc ponizej 100ms zapytania?

0

:D

Ty chyba sobie żartujesz, że ktoś w ogóle spojrzy na tak obrzydliwie wyglądające zapytanie - weź je napisz po ludzku (wiesz, entery, tabulatory itd.).

Poza tym skoro PMA zwraca zapytanie szybciej, wąskie gardło masz po stronie aplikacji na serwerze (być może jsonowanie zajmuje dużo czasu, ciężko zgadywać).

0

Używasz w tym Slim jakiegoś ORM? Jeżeli tak to zrezygnuj i wykonuj 'gołe' zapytanie. Jeżeli nie to problem tkwi po stronie samego frameworka i żadna optymalizacja zapytania nie rozwiąże tego problemu, zadaj pytanie w dziale PHP.

0

Wywal podzapytanie na korzyść JOINa.
Wywal DISTINCT.
Zrób EXPLAIN, pozakładaj odpowiednie indeksy...

0

Jest taka fajna strona: http://www.dpriver.com/pp/sqlformat.htm
Gdzie jednym klikiem robisz to:

SELECT DISTINCT ads.id, 
                ads.user_id, 
                (SELECT Count(saved_ads.user_id) 
                 FROM   saved_ads 
                 WHERE  saved_ads.ad_id = ads.id 
                        AND saved_ads.user_id = ?) AS subscribe, 
                us.name                            AS userName, 
                cat.name                           AS categoryName, 
                cit.name                           AS cityName, 
                ads.logo, 
                ads.title, 
                ads.description, 
                ads.lat, 
                ads.lon, 
                ads.visits, 
                ads.active, 
                ads.created_at 
FROM   ads 
       INNER JOIN users AS us 
               ON us.id = ads.user_id 
       INNER JOIN categories AS cat 
               ON cat.id = ads.category_id 
       INNER JOIN cities AS cit 
               ON cit.id = ads.city_id 
WHERE  ads.active = '1' 
       AND reviewed = '1' 
ORDER  BY ads.created_at DESC 
LIMIT  ? offset ?;   

Dużo łatwiej dla pomagających

1 użytkowników online, w tym zalogowanych: 0, gości: 1