Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL][PHP]LEFT JOIN - optymalizacja pracy zapytania (7sek)
kamilpl
post 8.03.2018, 13:15:37
Post #1





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 8.03.2018

Ostrzeżenie: (0%)
-----


Witam,
Mam 2 tabele: produkty oraz zdjęcia.
Produktów jest ok 200tys oraz zdjęć ok 400tys. Dla jednego produktu czasami przypada po kilka zdjęć. Nie wszystkie produkty mają zdjęcia.

Potrzebuje wyciągnąć max 10 produktów, które mają zdjęcia, oraz są promowane. Niby problem banalny, lecz na lokalnym serwerze zapytanie mieli się ok 7 sek, na serwerze prod. ok 4 sek. Czas ten stanowczo jest za długi. Kiedy z zapytania wywalę GROUP BY zapytanie na localhoscie trwa ok 2 sek.
Z góry dziękuje za pomoc.

O to moje zapytanie:
  1. SELECT cats.name, image.filename, ads.title,city.name,ads.id,ads.promotion FROM ads
  2. LEFT JOIN cities AS city ON ads.city_id = city.city_id
  3. LEFT JOIN adimages AS images ON images.adid = ads.adid
  4. LEFT JOIN adcats AS cats ON cats.catid = ads.catid
  5. WHERE cats.enabled = '1' AND ads.enabled = '1' AND ads.promotion = '1' AND images.filename IS NOT NULL
  6. GROUP BY ads.adid ORDER BY ads.type DESC, ads.hits DESC LIMIT 10
Go to the top of the page
+Quote Post
trueblue
post 8.03.2018, 13:36:48
Post #2





Grupa: Zarejestrowani
Postów: 6 761
Pomógł: 1822
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


LEFT JOIN są zupełnie niepotrzebne skoro:
1.Chcesz wyciągnąć produkty tylko ze zdjęciami.
2. Dodajesz warunki do tabel z LEFT JOIN w WHERE.
Zamiast GROUP BY możesz dać DISTINCT.


--------------------
Go to the top of the page
+Quote Post
kamilpl
post 8.03.2018, 13:40:04
Post #3





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 8.03.2018

Ostrzeżenie: (0%)
-----


Dzięki za odp.
Dlaczego LEFT jest nie potrzebne ? W takim razie jak wyciągnąć produkt ze zdjęciem skoro zdjęcia to osobna indeksowana tabela ?
Go to the top of the page
+Quote Post
trueblue
post 8.03.2018, 13:41:20
Post #4





Grupa: Zarejestrowani
Postów: 6 761
Pomógł: 1822
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


INNER JOIN lub złączenie w WHERE.


--------------------
Go to the top of the page
+Quote Post
Pyton_000
post 8.03.2018, 13:50:35
Post #5





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


Zostaw wszędzie samo JOIN

Przenieś `cats.enabled = '1'` do JOIN czyli

JOIN adcats AS cats ON cats.catid = ads.catid AND cats.enabled = '1'

To pozwoli trochę ograniczyć wyniki.

Poza tym sprawdź czy używa indeksów poprzez EXPLAIN Da Ci to jakiś ogląd na sprawę.
Go to the top of the page
+Quote Post
kamilpl
post 8.03.2018, 14:48:30
Post #6





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 8.03.2018

Ostrzeżenie: (0%)
-----


Dziękuje po użyciu Inner JOIN wygląda na to że ładowanie odbywa się szybciej. Czy może mi ktoś napisać tak po "chłopsku" jaka jest różnica miedzy LEFT/RIGHT a INNER na dużych zbiorach ?
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 19.04.2024 - 02:13