Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Optymalizacja zapytania
Forum PHP.pl > Forum > Bazy danych > MySQL
tomeknh
witam,

mam sklep na osc gold i muli mi strasznie serwer na nim...administratorzy napisali, że jest nieoptymalne zapytanie takie:

  1. SELECT DISTINCT p.products_id, p.products_image, p.products_quantity, p.products_tax_class_id, p.manufacturers_id, pd.products_name, IF(s.STATUS, s.specials_new_products_price, p.products_price) AS products_price FROM products p
  2. LEFT JOIN specials s ON p.products_id = s.products_id
  3. LEFT JOIN products_description pd ON p.products_id = pd.products_id
  4. LEFT JOIN products_to_categories p2c ON p2c.products_id = p.products_id
  5. LEFT JOIN categories c ON c.categories_id = p2c.categories_id
  6. WHERE c.categories_status='1' AND p.products_status = '1' AND pd.language_id = '1' AND DATE_SUB(CURDATE(),INTERVAL 21 DAY) <= p.products_date_added LIMIT 1


i ze zoptymalizowanie tego zapytania rozwiąże problem...

Jak zaoptymalizować to zapytanie?

Z góry dziękuję i pozdrawiam!
Niktoś
Można by pokombinować z union all o ile da rade.Czytałem gdzieś, że union jest wydatniejszy niż złączenia join.
Zobacz na ten link-może pomoże:
http://stackoverflow.com/questions/3374459...joins-just-suck
alegorn
union?
o ile pamietam to jedynie przy OR robi roznice (poza tym jak chcesz wtedy polaczyc tabele...?)
join jest ok. mysql lepiej sobie z tym poradzi niz z union



sprawdz explainem, czy masz pozakladane potrzebne indeksy. to po pierwsze,
jesli nie osiagniesz zadowalajacych rezyltatow - sprobuj profilowania. tam znajdziesz waskie gardlo zapytania.

ja osobiscie sprobowalbym dodatkowo ten kawalek kodu:
  1. c.categories_status='1' AND p.products_status = '1' AND pd.language_id = '1' AND DATE_SUB(CURDATE(),INTERVAL 21 DAY) <= p.products_date_added LIMIT 1


po pierwsze - sprawdz jakiego typu sa te kolumny, jesli sa numeryczne - wywal cudzyslowy, (tak - musisz dokonac konwersji typu, niby nie wiele, ale zawsze wolniej)

sprawdzilbym tez ta operacje na datach, nie wiem jakiego masz typu kolumny, jesli jest to jakas forma stringa - to moze warto by bylo przekonwertowac.

to takie pierwsze pomysly, od czego bym zaczynal.
no, i zastanowilbym sie czy koniecznie jest mi potrzebne sprawdzanie produktow z ostatnich 3 tygodni....
moze wystarczyl by limit??

j.


Niktoś
Zobacz na link, który podałem,nawet są tam przykłady z kwerendami podobnymi do tych co autor tematu przedstawił.Z ich testów wynika ,że użycie Union All znacznie przyspieszyło operacje na bazie.
alegorn
oczywiscie, tak jak napisalem, roznica jest gdy uzywasz OR
zauwaz, ze w linku ktory podales - nie zrezygnowano z JOIN, tylko z OR

Niktoś
Cytat
roznica jest gdy uzywasz OR


Przy operatorze AND już nie?Spójrz na linie 6 w kwerendzie autora.
gothye
wklej EXPLAIN zapytania
alegorn
linia 6?
tzn:

  1. SELECT N.*
?

nie bardzo lapie.

AND nie robi roznicy.
jesli sa odpowiednio pozakladane indeksy - join bedzie najwydajniejszym rozwiazaniem.
Niktoś
Chodziło mi o kwerendę autora tego tematu,nie o tamtą stronęsmile.gif

LEFT JOIN categories c ON c.categories_id = p2c.categories_id
WHERE c.categories_status='1' AND p.products_status = '1' AND pd.language_id = '1' AND DATE_SUB(CURDATE(),INTERVAL 21 DAY) <= p.products_date_added LIMIT 1
Piszesz ,że or robi różnice a and już nie co jest to dla mnie zastanawiające.
cudny
Cytat(Niktoś @ 19.03.2012, 17:02:12 ) *
Zobacz na link, który podałem,nawet są tam przykłady z kwerendami podobnymi do tych co autor tematu przedstawił.Z ich testów wynika ,że użycie Union All znacznie przyspieszyło operacje na bazie.


biggrin.gif A czy union to nie powinno mieć takiej samej struktury kolumn biggrin.gif ?
Join powinien dać radę - tutaj nie widze nic nienormalnego w twoim zapytaniu oprócz jak już mój przedmówca zauważył '1' - to powinno być numeryczne.
Poza tym w tym wypadku powinieneś, ba nawet bardzo powinieneś pozakładać klucze obce - w mysql działają w silniku inno db - w myisam już nie, niestety.
alegorn
hmm ok, ale tutaj AND juz nie robi roznicy.

poszukaj sobie w necie OR vs UNION
znajdziesz tego mutlum, jak dobrze poszukasz to bedzie opisane nawet dlaczego :]

edit:
nie chce robic posta pod postem.
de facto wydaje mi sie ze jesli wywalisz sprawdzenie odnosnie daty - powinno znaczaco przyspieszyc.

zastanawia mnie LIMIT 1
tak jest zbudowane owo zapytanie? czy tez po drodze ktos dokleil?

To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.