Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Optymalizacja zapytania z wielu tabel
Forum PHP.pl > Forum > Bazy danych > MySQL
Pyrfee
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 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" 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 smile.gif
sowiq
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ć.
Pyrfee
No właśnie jak tutaj między znacznikami [ sql ] zrobić łamanie linii ? 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.
sowiq
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 winksmiley.jpg
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.