Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL] Któro z tych zapytań będzie wydajniejsze ?
Forum PHP.pl > Forum > Przedszkole
jajcarzd1
Witam

Mam pytanie. Otóż mam tabelę produktów oraz drugą tabelę w kórej jest określony narzut na danych produkt dla danaego użytkownika. Ta druga ma 3 kolumny

idProducts, idUsers, surcharge

I teraz w trakcie pobieranie listy produktów są obliczane ceny dla użytkowknika który jest zalogowany do systemu. Jeśli w tabeli z określonymi narzutami znajdzie się rekord dla danego usera i produktu to jest brana wartość narzutu dla tego rekordu jeśli natomiast nie ma to jest brana jakaś domyślna wartośc narzutu jaka została określona dla tego usera.

I teraz mam takie zapytanie. W nim obliczam wartość ceny sprzedaży netto i brutto, ale jak widac dwukrotnie są sprawdzane pola i wykonywane operacje matematyczne.

W przykładzie jest brany pod uwagę user o id = 1

  1.  
  2. SET @surcharge = 10; ///TO jest jakaś wartość domyślnego narzutu procentowego dla danego danego usera
  3.  
  4. SELECT p.name,up.surcharge,
  5. IF(ISNULL(up.surcharge),ROUND((p.netPurchasePrice * (1 + (@surcharge/100))),2),ROUND((p.netPurchasePrice * (1 + (up.surcharge/100))),2)) AS netSalesPrice,
  6. IF(ISNULL(up.surcharge),ROUND((p.netPurchasePrice * (1 + (p.tax/100)) * (1 + (@surcharge/100))),2),ROUND((p.netPurchasePrice * (1 + (up.surcharge/100))),2)) AS grossSalesPrice
  7. FROM products AS p
  8. LEFT JOIN users_products AS up ON p.idProducts = up.idProducts AND up.idUsers = 1
  9. WHERE p.activity = 1
  10.  
  11.  


W tej wersji jest tak że wartośc ceny sprzedaży netto przypisuję do zmiennej i ją wykorzystuję do obliczenia ceny brutto

  1.  
  2. SET @surcharge = 10; ///TO jest jakaś wartość domyślnego narzutu procentowego dla danego danego usera
  3.  
  4. SELECT p.name,up.surcharge,
  5. IF(ISNULL(up.surcharge),@netSalesPrice:= ROUND((p.netPurchasePrice * (1 + (@surcharge/100))),2),@netSalesPrice:= ROUND((p.netPurchasePrice * (1 + (up.surcharge/100))),2)) AS netSalesPrice,
  6. (@netSalesPrice * (1 + (p.tax/100))) AS grossSalesPrice
  7. FROM products AS p
  8. LEFT JOIN users_products AS up ON p.idProducts = up.idProducts AND up.idUsers = 1
  9. WHERE p.activity = 1
  10.  


Wydaje mi się że to drugie rozwiazanie powinno być wydajniejsze i szybsze choć jakoś za bardzo nei widzę różnicy w czasie wykonywanie zapytania. Co sądzicie o tym ?
tehaha
to może wykonaj to w pętli z 10 000 razy za każdym razem zapisuj czas wykonania do tablicy i wylicz czas średni wykonania każdego zapytania, wtedy się dowiesz co działa szybciej
erix
A explain używałeś?
jajcarzd1
Cytat(erix @ 31.05.2010, 14:48:32 ) *
A explain używałeś?



No explain widzę jest identyczny
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.