Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Długo wykonujące się zapytanie
aras785
post
Post #1





Grupa: Zarejestrowani
Postów: 859
Pomógł: 177
Dołączył: 29.10.2009

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


  1. SELECT
  2. DISTINCT SQL_CALC_FOUND_ROWS `produkty`.*
  3. ,
  4. CASE
  5. WHEN `produkty`.`cena_prom` < `produkty`.`cena`
  6. AND `produkty`.`cena_prom` > '0'
  7. THEN (
  8. CASE
  9. WHEN (`producenci`.`prowizja` IS NOT NULL AND `kategorie`.`prowizja` IS NOT NULL)
  10. THEN (`produkty`.`cena_prom` * (1 + (`produkty`.`prowizja` / 100) + (`producenci`.`prowizja` / 100) + (`kategorie`.`prowizja` / 100) ))
  11. WHEN (`producenci`.`prowizja` IS NOT NULL AND `kategorie`.`prowizja` IS NULL)
  12. THEN (`produkty`.`cena_prom` * (1 + (`produkty`.`prowizja` / 100) + (`producenci`.`prowizja` / 100) ))
  13. WHEN (`producenci`.`prowizja` IS NULL AND `kategorie`.`prowizja` IS NOT NULL)
  14. THEN (`produkty`.`cena_prom` * (1 + (`produkty`.`prowizja` / 100) + (`kategorie`.`prowizja` / 100) ))
  15. ELSE (`produkty`.`cena_prom` * (1 + (`produkty`.`prowizja` / 100) ))
  16. END
  17. )
  18. ELSE (
  19. CASE
  20. WHEN (`producenci`.`prowizja` IS NOT NULL AND `kategorie`.`prowizja` IS NOT NULL)
  21. THEN (`produkty`.`cena` * (1 + (`produkty`.`prowizja` / 100) + (`producenci`.`prowizja` / 100) + (`kategorie`.`prowizja` / 100) ))
  22. WHEN (`producenci`.`prowizja` IS NOT NULL AND `kategorie`.`prowizja` IS NULL)
  23. THEN (`produkty`.`cena` * (1 + (`produkty`.`prowizja` / 100) + (`producenci`.`prowizja` / 100) ))
  24. WHEN (`producenci`.`prowizja` IS NULL AND `kategorie`.`prowizja` IS NOT NULL)
  25. THEN (`produkty`.`cena` * (1 + (`produkty`.`prowizja` / 100) + (`kategorie`.`prowizja` / 100) ))
  26. ELSE (`produkty`.`cena` * (1 + (`produkty`.`prowizja` / 100) ))
  27. END
  28. )
  29. END AS `cena_correct`
  30. FROM `produkty`
  31. LEFT JOIN `producenci` ON `producenci`.`id` = `produkty`.`producent` LEFT JOIN `kategorie` ON `kategorie`.`id` = `produkty`.`prod_kat`


Czas wykonywania średnio 3 sekundy! i myślę, że przez to przez to serwer mysql wyciąga 100% procesora...

explain:
(IMG:http://i.imgur.com/sXDv8Su.png)

Proszę o pomoc

Ten post edytował aras785 20.08.2014, 11:11:23
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 5)
nospor
post
Post #2





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Sieczka..... (IMG:style_emoticons/default/wink.gif)

Te podzapytanie:
LEFT JOIN (SELECT prod_id,SUM(stock) AS ilosc FROM cechy_magazyn WHERE stock>0 GROUP BY prod_id) cm ON cm.prod_id=produkty.id AND cm.ilosc>0
jest ci potrzebne?
Wywal je i sprawdz jak sie bedzie wowczas wykonywalo zapytanie. Wydaje mi się, że to może to podzapytanie ostro zamulac.
Go to the top of the page
+Quote Post
aras785
post
Post #3





Grupa: Zarejestrowani
Postów: 859
Pomógł: 177
Dołączył: 29.10.2009

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


Nospor pomyliłem zapytania. Zrobiłem aktualizacje pierwszego posta. Niby proste zapytania, a tak zamula. Chodzi o LEFT JOIN... i nie wiem dlaczego tak zwalniają.
Go to the top of the page
+Quote Post
nospor
post
Post #4





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Jestes pewien ze teraz mowa o wlasciwym zapytaniu?

Wywal: DISTINCT SQL_CALC_FOUND_ROWS
przyspieszylo?

edit:
Zrob tez odwrotny myk, czyli zostaw to co kazalem ci wywalic, a wywal tego CASE. Jest tam od groma operacji i zanim zadziala DISTINCT to to wszystko musi byc wyliczone. Jesli ta opcja przyspieszy, to wywliczaj te rzeczy dopiero w php a nie na etapie zapytania
Go to the top of the page
+Quote Post
Pyton_000
post
Post #5





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

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


Ehhh... Pobierz sobie normalnie jak człowiek produkty, a w modelu zrób sobie metodę getCorrectPrice na podstawie produktu...
Go to the top of the page
+Quote Post
CuteOne
post
Post #6





Grupa: Zarejestrowani
Postów: 2 958
Pomógł: 574
Dołączył: 23.09.2008
Skąd: wiesz, że tu jestem?

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


Z tego co pamiętam to SQL_CALC_FOUND_ROWS nie wykorzystuje indeksów, to może być powodem tak długiego wykonywania zapytania, może spróbuj ze starym sprawdzonym COUNT()?
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 24.08.2025 - 10:45