Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Różnica w zapytaniach
Forum PHP.pl > Forum > Bazy danych > MySQL
yarwa
Witam,

Mój pierwszy post smile.gif Mam pytanie odnośnie polecenia mysql_query. Jakoś nie mogłem się nigdzie doszukać, a jestem laikiem w sprawie baz danych.

Mam jedną aktualną tablicę i tablicę wartości w bazie danych. Kod 1 wygląda tak:

  1. <?php
  2. $zapytanie = "SELECT * FROM buyers";
  3.  $baza = mysql_query($zapytanie);
  4.  
  5.  while ( $wiersz = mysql_fetch_assoc($baza) )
  6.  // tutaj jakiś kod porównujący i coś tam liczący
  7. ?>


Natomiast kod 2 wygląda tak:

  1. <?php
  2. $zapytanie = "SELECT * FROM buyers WHERE `user_id`=".$tablica[$i];
  3. $baza = mysql_query($zapytanie); 
  4.  
  5. $wiersz = mysql_fetch_assoc($baza);
  6.  
  7. if ( $test ) 
  8.  // wykonaj działanie
  9. ?>


Moje pytanie jest następujące: Czy wywołanie mysql_query powoduje wywołanie zapytania na bazie danych i przetrzymuje wynik gdzieś w pamięci? Czy jest to raczej na zasadzie "resource" jak na przykład przy otwieraniu pliku na dysku, a dopiero mysql_fetch wywołuje zapytanie pobierania z bazy. W drugim wypadku jak dobrze rozumiem dwa kody miałyby identyczny wpływ na obciążenie bazy danych.
Kicok
mysql_query() - PHP wysyła do bazy danych zapytanie SQL, pobiera wynik tego zapytania i zwraca resource

mysql_fetch_xxx() - PHP układa przetrzymywany u siebie wynik zapytania w odpowiednią tablicę i ją zwraca


Lepszy wydajnościowo jest oczywiście drugi przykład.
devnul
przykłady różnią się od siebie wynikiem działania więc nie można mówić że jeden jest lepszy a drugi gorszy :|
yarwa
Możliwe, że nie opisałem do końca tongue.gif Mam aktualne dane w tablicy "dane_aktualne".

W przypadku tego kodu:
  1. <?php
  2. $zapytanie = "SELECT * FROM buyers";
  3. $baza = mysql_query($zapytanie);
  4.  
  5. while ( $wiersz = mysql_fetch_assoc($baza) )
  6.  // tutaj jakiś kod porównujący i coś tam liczący
  7. ?>


pobieram całą zawartość tablicy z bazy danych. I teraz muszę znaleźć w "dane_akutalne" wiersz odpowiadający aktualnemu wierszowi z bazy danych i porównać wartości obu tablic, czyli $wiersz i $dane_aktualne[$i]. Wadą tego rozwiązania jest to, że jak baza urośnie to będę miał np. 1000, 10000 wierszy do porównania z drugą tablicą.. max 200 wierszy.

Natomiast w przypadku tego kodu:

  1. <?php
  2. for ( $i; bla bla; $i++ )
  3.  {
  4. $zapytanie = "SELECT * FROM buyers WHERE `user_id`=".$dane_aktualne[$i];
  5. $baza = mysql_query($zapytanie); 
  6.  
  7. $wiersz = mysql_fetch_assoc($baza);
  8.  
  9. if ( $test ) 
  10.  // wykonaj działanie
  11.  }
  12. ?>


Tak naprawdę ograniczam się tylko to porównania wybranych rekordów o określonym user_id. Czyli sprawdzam tylko to co muszę uaktualnić. W drugim przypadku jak wynika będę miał np. 200 zapytań do bazy, ale zwrócony zostanie maksymalnie jeden wiersz lub 0, jeśli nie ma go w bazie.

I teraz chodzi o wydajność takiego rozwiązania.. zrobić jedno zapytanie a później sprawdzać wszystko(baza przeciez stale rośnie) z nowymi, czy zrobić tylko określoną ilość zapytań i przetwarzać tylko te przypadki. Nie wiem czy takie masowe wysyłanie zapytań nie przeciąży bazy. Oczywiście pierwszy sposób można zoptymalizować na razie tylko testuję.

Ewentualnie jeśli ktoś zna jakiś pomysła na to aby uaktualnić w prosty sposób baze lub jakiś algorytm będę wdzięczny tongue.gif
devnul
nie wiem czy dobrze rozumiem Twój problem ale przecierz chyba drugie zapytanie tez można wykonać tylko raz i pobrać wszystkie wyniki. mam na myśli coś takiego

  1. SELECT * FROM tabela WHERE id IN (dane, dane, dane, dane, dane)
a to zwróci ci jednorazowo wszystkie niezbędne pola (i imho bdzie najszybsze)
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.