Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Optymalizacja zapytania
tomeknh
post
Post #1





Grupa: Zarejestrowani
Postów: 90
Pomógł: 0
Dołączył: 2.12.2007

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


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!
Go to the top of the page
+Quote Post
Niktoś
post
Post #2





Grupa: Zarejestrowani
Postów: 1 195
Pomógł: 109
Dołączył: 3.11.2011

Ostrzeżenie: (10%)
X----


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

Ten post edytował Niktoś 19.03.2012, 16:55:28
Go to the top of the page
+Quote Post
alegorn
post
Post #3





Grupa: Zarejestrowani
Postów: 341
Pomógł: 40
Dołączył: 23.06.2009

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


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.


Go to the top of the page
+Quote Post
Niktoś
post
Post #4





Grupa: Zarejestrowani
Postów: 1 195
Pomógł: 109
Dołączył: 3.11.2011

Ostrzeżenie: (10%)
X----


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.

Ten post edytował Niktoś 19.03.2012, 17:02:36
Go to the top of the page
+Quote Post
alegorn
post
Post #5





Grupa: Zarejestrowani
Postów: 341
Pomógł: 40
Dołączył: 23.06.2009

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


oczywiscie, tak jak napisalem, roznica jest gdy uzywasz OR
zauwaz, ze w linku ktory podales - nie zrezygnowano z JOIN, tylko z OR

Go to the top of the page
+Quote Post
Niktoś
post
Post #6





Grupa: Zarejestrowani
Postów: 1 195
Pomógł: 109
Dołączył: 3.11.2011

Ostrzeżenie: (10%)
X----


Cytat
roznica jest gdy uzywasz OR


Przy operatorze AND już nie?Spójrz na linie 6 w kwerendzie autora.
Go to the top of the page
+Quote Post
gothye
post
Post #7





Grupa: Zarejestrowani
Postów: 702
Pomógł: 65
Dołączył: 16.03.2009

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


wklej EXPLAIN zapytania


--------------------
Nie udzielam pomocy poprzez PW
Go to the top of the page
+Quote Post
alegorn
post
Post #8





Grupa: Zarejestrowani
Postów: 341
Pomógł: 40
Dołączył: 23.06.2009

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


linia 6?
tzn:

  1. SELECT N.*
?

nie bardzo lapie.

AND nie robi roznicy.
jesli sa odpowiednio pozakladane indeksy - join bedzie najwydajniejszym rozwiazaniem.
Go to the top of the page
+Quote Post
Niktoś
post
Post #9





Grupa: Zarejestrowani
Postów: 1 195
Pomógł: 109
Dołączył: 3.11.2011

Ostrzeżenie: (10%)
X----


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.

Ten post edytował Niktoś 19.03.2012, 17:41:49
Go to the top of the page
+Quote Post
cudny
post
Post #10





Grupa: Zarejestrowani
Postów: 387
Pomógł: 66
Dołączył: 31.03.2005
Skąd: Kielce

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


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.


--------------------
..::: Jak pomogłem to kliknij pomógł. Tak rzadko używacie tej opcji :( :::..
Go to the top of the page
+Quote Post
alegorn
post
Post #11





Grupa: Zarejestrowani
Postów: 341
Pomógł: 40
Dołączył: 23.06.2009

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


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?



Ten post edytował alegorn 20.03.2012, 12:03:46
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 Aktualny czas: 21.08.2025 - 23:15