Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Wiele zapytań SELECT vs zbiorcze
hopsey
post 20.06.2012, 14:27:54
Post #1





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 13.07.2010

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


Hej,

mam prośbę o analizę i opinię nt. rozwiązania, którego założeniem jest poprawienie szybkości pracy aplikacji przez ograniczenie wykonywanych zapytań do bazy danych.
Załóżmy taka sytuację - mamy listing produktów, przy każdym z produktów trzeba wyświetlić komentarze do produktu.

Produkty wyciągam np tak:

  1. $products = $tabela->fetchAll();


później w widoku mam foreach, komentarze wyciągam w taki sposób:

  1.  
  2. foreach($products as $product) {
  3. $komentarze = $products->getComments();
  4. }
  5.  


wywołanie metody getComments() powoduje wysłanie zapytania do bazy o komentarze do konkretnego produktu. w praktyce to wygląda tak, że dla 5000 produktów 5000 razy wykona się zapytanie do bazy. Oczywiście - wiem, że jest stronicowanie, ale chodzi mi o analizę sytuacji, dlatego w tym przykładzie z tego nie skorzystam smile.gif

i teraz moje pytanie - czy nie lepiej byłoby przygotować sobie wcześniej w PHP te dane?
zabrać identyfikatory produktów w tablicę i wyciagnąć jednym zapytaniem korzystajac z IN(id1, id2, id3 ...) ?

  1.  
  2. $ids = array();
  3. foreach($products as $product) {
  4. $ids[] = $product->getId();
  5. }
  6.  
  7. $commentsByProductId = $tabela->findByProductIds($ids); // załóżmy, że komentarze są posortowane wg product_id
  8.  
  9. foreach($commentsByProductId as $productId => $comments) {
  10. foreach($comments as $comment) {
  11. if(array_key_exists($productId, $products)) {
  12. $products[$productId]->addComment($comment);
  13. }
  14. }
  15. }
  16.  
  17.  


w efekcie mamy dwa zapytania - jedno o produkty, drugie o komentarze z klauzulą WHERE z IN z identyfikatorami 5000 produktów.

Czy to nam znacznie odciąża bazę danych? Czy warto stosować tego typu rozwiązania przy optymalizacji?

z góry dzięki za wszystkie opinie!
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 3)
nospor
post 20.06.2012, 14:34:26
Post #2





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




Pierwsze rozwiązanie to poroniony pomysł.... najgorsze co możesz zrobic to pierwsze rozwiązanie.
Drugie jest ok.

Możesz też pobierać jednym zapytaniem i produkty i komentarze. Ale to komplikuje sprawę przy stronicowaniu.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
hopsey
post 20.06.2012, 14:49:59
Post #3





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 13.07.2010

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


dzięki za odpowiedź. Tego też się spodziewam wink.gif

czy możemy jakoś mniej więcej wyjaśnić z czego to wynika? np. wywołanie pojedynczego zapytania do bazy kosztuje jakieś setne ułamki sekund i ten czas zyskujemy poprzez skupienie zapytań w jedno?

osobiście zawsze optymalizuję aplikację tam gdzie to możliwe na każdej płaszczyźnie (z DB na czele - np lazy load na Rowsecie z rozwiązaniem z tym w stylu przykładu nr 2 wyżej), jednak ostatnio przejąłem projekt, gdzie rozwiązań optymalizacyjnych, o zgrozo, jest nie więcej niż 0. Aplikacja będzie operować na bardzo dużym rozmiarze danych, stąd moje obawy.
Go to the top of the page
+Quote Post
nospor
post 20.06.2012, 14:55:16
Post #4





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




Cytat
czy możemy jakoś mniej więcej wyjaśnić z czego to wynika? np. wywołanie pojedynczego zapytania do bazy kosztuje jakieś setne ułamki sekund i ten czas zyskujemy poprzez skupienie zapytań w jedno?
Wykonaj sobie 5tys zapytań na raz w aplikacji php i sam zrozumiesz wink.gif
Nawet jeśli przejdzie to przez stronicowanie i będzie to powiedzmy 30 zapytań, to nadal jest to niesamowity zbędny koszmar.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

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: 19.07.2025 - 04:17