Nuk e di çfarë optimizimesh kryen MySQL përbrenda, por kërkesa me nënkërkesë (subquery) mendoj se do merrte më shumë kohë.
E zëmë se kemi N klientë, M porosi, dhe K klientë pa asnjë porosi. Tani le të bëjmë një analizë të thjeshtë të të dyja kërkesave.
Kërkesa me nënkërkesë (subquery)
Kodi:
SELECT *
FROM klientet
WHERE id NOT IN(
SELECT t1.id
FROM klientet as t1
INNER JOIN porosite as t2 ON t1.id=t2.cust_id
)
Kërkesa e jashtme do kthejë një listë L1 me N rreshta, një për çdo klient. Kërkesa e brendshme do kthejë një listë L2 me M rreshta, një për çdo porosi. Çdo element të L1 do na duhet ta krahasojmë me elementët e L2 deri sa të gjenden dy njësoj.
Kodi:
T(kërkesës) = T(kërkesës së jashtme) + T(kërkesës së brendshme)
T(kërkesës) = T(SELECT) + T(WHERE) + T(SELECT) + T(INNER JOIN)
T(kërkesës) = N + T(N-K) + T(K) + N + M
T(kërkesës) = N + N*M/2 + K*M + N + M
T(kërkesës) = O(N*M/2 + K*M)
Kërkesa me grupim (group by)
Kodi:
SELECT t1.*, count(t2.klient_id) as numriPorosive
FROM klientet as t1
LEFT JOIN orders as t2 ON t1.id=t2.klient_id
GROUP BY t1.id
HAVING numriPorosive=0
Join kthen M + K rreshta të cilët grupohen në M kohë dhe filtrohen në N kohë.
Kodi:
T(kërkesës) = T(SELECT) + T(JOIN) + T(GROUP BY) + T(HAVING)
T(kërkesës) = N + M + K + M + N
T(kërkesës) = O(M)
Rezultati
Nga analiza e mësipërme duket qartë së kërkesa me grupim është më e shpejtë me një faktor Maks(N/2 , K). Në kërkesën e parë faktori mbizotërues është filtrimi i WHERE me NOT IN, ndërsa në kërkesën e dytë faktori mbizotërues është LEFT JOIN.
Krijoni Kontakt