Jak efektywnie pobrać wszystkie krotki z tabeli?

Jak efektywnie pobrać wszystkie krotki z tabeli?
poniatowski
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1668
1

Witam!

Mam tabele, ktora ma setki produktow, jak nie tysiace. Czy PHP PDO moge pobrac rekord po rekordzie czy musze uzywac LIMIT i OFFSET? Nie chce przeladowac pamieci i zabic serwer ladujac wszystkie rekordy to RAM.

Mam zapytanie:

Kopiuj
SELECT * FORM products;

Tabela product posiada 9999999 rekordow. Jak napisac zapytanie, zeby nie zabic serwera? Kiedys cos czytalem, ze PDO interfejs ma taki mechanizm, ktory zamiast wczytywac w jednym zapytaniy 9999999 rekordow, czyta pojedyncze rekordy. Nie wiem, czy to byl jakis bufor czy cos, nie moge teraz znalezc tego w dokumentacji.

TR
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: 700m n.p.m.
  • Postów: 687
1

Tak, jeżeli chodzi o cały rezultat to zarządza nim bardziej silnik bazy danych niż samo PHP. To nie jest tak, że po wykonaniu takiego zapytania całość rekordów od razu jest ładowana do pamięci - niekoniecznie. Jeżeli u siebie w PHP nie będziesz całości gromadził np. w tablicy tylko sukcesywnie rekord po rekordzie "obrabiał", a nastepnie wyrzucał z pamięci to nie powinno być problemu. Inna kwestia ile to wszystko będzie trwać czasu, i czy to jest akceptowalne.

poniatowski
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1668
1

@TomRZ Pamietasz moze jak nazywa sie wbudowana funkcja PDO ktora wlasnie pobiera pojedynczy rekord z calego zapytania? Nie moge tego znalezc. Ale jak piszesz jak bedziemy wyoknywac pytanie po zapytaniu to moze ooo wiele dluzej trwac jak np kilka zapytan z limitem 10000. Prawda?

L7
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 435
1
poniatowski napisał(a):

@TomRZ Pamietasz moze jak nazywa sie wbudowana funkcja PDO ktora wlasnie pobiera pojedynczy rekord z calego zapytania? Nie moge tego znalezc. Ale jak piszesz jak bedziemy wyoknywac pytanie po zapytaniu to moze ooo wiele dluzej trwac jak np kilka zapytan z limitem 10000. Prawda?

Chodzi Ci o fetch() a fetchAll() ???

TR
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: 700m n.p.m.
  • Postów: 687
1
Kopiuj
$PDO = new \PDO($dsn);
$stmt = $PDO->query("SELECT * FORM products");
while ( $row = ($stmt->fetch(\PDO::FETCH_ASSOC)) ) {
  
  // TUTAJ COŚ ROBIMY Z $row
  
}

to wszystko, wykonanie drugiej linii nie znaczy, że cały rezulat, wszystkie dane z tabeli products, od razu lądują w pamięci

poniatowski
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1668
1

@TomRZ: ok, myslalem, ze jest cos innego. Musze poczytaj o fetch. A moze lepiej w takim razie uzyc fetch all z limit i offset? Chodzi wylacznie o duze zapytanie, ktore zwraca bardzo duzo rekordow. No, ale przy tym trzeba uwazac, zeby skrypt sie nie rozlozyc przez brak pamieci.

TR
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: 700m n.p.m.
  • Postów: 687
1

Nie, fetchAll zaladuje wszystko naraz do pamięci, a tego właśnie nie chcesz.

Robisz iteracje po danych przy pomocy zwróconego kursora, pobierając pojedyńczo do pamięci produkt i robiąc z nim to co chcesz robić i to wszystko.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.