Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Optymalizacja zapytania z wielu tabel, Zapytanie wykonuje się kilka minut
Pyrfee
post 19.04.2009, 11:01:06
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 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

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 19.04.2009, 11:14:39
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 19.04.2009, 11:32:32
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 ? 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 19.04.2009, 12:24:06
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 winksmiley.jpg
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 Wersja Lo-Fi Aktualny czas: 25.07.2025 - 10:42