Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Optymalizacja zapytania z wielu tabel, Zapytanie wykonuje się kilka minut
Pyrfee
post
Post #1





Grupa: Zarejestrowani
Postów: 6
Pomógł: 0
Dołączył: 11.01.2006

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


Witam

Mam pewien problem, chcąc zoptymalizować zapytania do bazy MySQL złożyłem jedno duże zapytanie. Po wielu próbach udało mi się złożyć zapytanie, które działa (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Niestety przy kilkunastu tysiącach rekordów moje zapytanie wykonuje się kilka minut co jest nie do przyjęcia. Chodzi o sklep internetowy.

Czy da się coś zrobić jeszcze z tym zapytaniem czy muszę wykombinować coś innego ?

  1. SELECT SQL_CALC_FOUND_ROWS p.*, tr.title, (SELECT ph.file FROM prod_photos ph WHERE ph.id_product = p.id ORDER BY ph.sort LIMIT 1 ) AS file
  2. FROM prod_products p, prod_products_trans tr
  3. WHERE p.id_category IN (14,56,43,78,65) AND (SELECT COUNT(id) FROM prod_features_values pfv WHERE p.id = pfv.id_product AND pfv.id_feature = "62" AND pfv.value = "lato") > 0 AND (SELECT COUNT(id) FROM prod_features_values pfv WHERE p.id = pfv.id_product AND pfv.id_feature = "5" AND pfv.value = "205") > 0 AND p.id = tr.id_parent AND tr.lang = "pl" AND p.flag_archive = "0" AND p.flag_active = "1"
  4. GROUP BY p.id
  5. ORDER BY p.ORDER DESC


W tym zapytaniu chodzi o to żeby wybrać produkty, które mają cechy równe "lato" oraz "205" (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

prod_products - tabela z produktami
prod_products_trans - tabela z tłumaczeniem do produktów
prod_features_values - tabela z cechami produktu np. sezon = lato, grubość = 350, wysokość = 100

Liczę na pomoc kolegów (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

Ten post edytował Pyrfee 19.04.2009, 11:03:10
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 3)
sowiq
post
Post #2





Grupa: Zarejestrowani
Postów: 1 890
Pomógł: 339
Dołączył: 14.12.2006
Skąd: Warszawa

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


Ja bym to zrobił mniej-więcej tak:
  1. SELECT SQL_CALC_FOUND_ROWS p.*, ph.file
  2. FROM prod_products p
  3. LEFT JOIN prod_photos ph ON (p.id = ph.id_product)
  4. LEFT JOIN prod_products_trans tr ON (p.id = tr.id_parent)
  5. LEFT JOIN prod_features_values pfv ON (p.id = pfv.id_product)
  6. WHERE p.id_category IN (14,56,43,78,65) AND pfv.id_feature = '62' AND pfv.value = 'lato' AND p.flag_archive = "0" AND p.flag_active = "1"
  7. ORDER BY p.ORDER DESC

Mogłem ominąć jakieś warunki, bo Twoje zapytanie jest zupełnie nieczytelne. Ale korzystając z tego wzoru powinieneś sobie sam poradzić.

Ten post edytował sowiq 19.04.2009, 11:15:55
Go to the top of the page
+Quote Post
Pyrfee
post
Post #3





Grupa: Zarejestrowani
Postów: 6
Pomógł: 0
Dołączył: 11.01.2006

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


No właśnie jak tutaj między znacznikami [ sql ] zrobić łamanie linii ? (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Chciałem wkleić bardziej przejrzyście moje zapytanie ale BR'y nie działają...

Co do zapytania to Twój przykład działa, ale tylko wtedy kiedy filtruje po jednej z cech np. sezon = lato. Gdy dodam do tego np. szerokosc = 205 to już zapytanie zwraca 0 wyników. Poza tym muszę użyć RIGHT JOIN, ponieważ chcę wyniki tylko z wszystkimi pasującymi cechami.
Go to the top of the page
+Quote Post
sowiq
post
Post #4





Grupa: Zarejestrowani
Postów: 1 890
Pomógł: 339
Dołączył: 14.12.2006
Skąd: Warszawa

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


Jeśli w tabeli prod_features_values masz dla jednego produktu kilka wpisów dotyczących poszczególnych właściwości, to masz dwa wyjścia:
- zrobić po jednym JOIN'ie dla każdej cechy
- zastosować EXISTS
- zrobić jedno podzapytanie

Ale na gotowca nie licz (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)
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: 22.10.2025 - 13:37