Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wiele zapytań SELECT vs zbiorcze
Forum PHP.pl > Forum > Bazy danych > MySQL
hopsey
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!
nospor
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.
hopsey
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.
nospor
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.
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.