Jak efektywnie pobrać wszystkie krotki z tabeli?

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:

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.

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.

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?

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() ???

1
$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

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.

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.

1 użytkowników online, w tym zalogowanych: 0, gości: 1