Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Symfony] Jak przyspieszyć dodawanie rekordów do bazy?
Forum PHP.pl > Forum > PHP > Frameworki
SnakeEater
Mam kolejny, taki o to problem.
  1. public function generateTokens()
  2. {
  3. for($i = 0; $i < $this->tokensToGen; $i++)
  4. {
  5. $vt = new Token();
  6. $vt->setQuestion($this);
  7. $vt->save();
  8. }
  9. }


Tokeny są generowane w sporej ilości (po około 100). Jak można przyśpieszyć dodawanie tych rekordów? jeżeli stworzę obiekty, ale zakomentuję linijkę $vt->save(); to całość działa super szybko, więc to dodawanie rekordów niestety długo trwa. Czy można jakoś przyspieszyć dodawanie tych rekordów do bazy? Czy są one dodawane w tym samym połączeniu? Czy może to być powód tak powolnego dodawania?
destroyerr
Są dodawane w tym samym połączeniu. Może działać powoli ze względu na budowanie zapytania lub ze względu na powolną bazę danych.
Samo wstawianie do bazy można przyspieszyć korzystając z transakcji.
Budowanie zapytania można też przyspieszyć. Potrzebujesz dobrać się do raz stworzonego zapytania i samemu bindować do niego.

Napisz jeszcze co oznacza, że długo trwa. Wypróbuj też działanie na serwerze produkcyjnym. Nie wiem dokładnie z czego to wynika ale w moim przypadku różnice w szybkości działania potrafią być ogromne.
phpion
Utwórz sobie klasę do tworzenia tzw. multi-insertów czyli zamiast:
  1. INSERT INTO tab (id) VALUES (1);
  2. INSERT INTO tab (id) VALUES (2);
  3. INSERT INTO tab (id) VALUES (3);

wykonującą:
  1. INSERT INTO tab (id) VALUES (1), (2), (3);

Na stronie Doctrine swego czasu czytałem, że nie Doctrine takiej możliwości nie ma i mieć nie będzie bo nie każdy standard przyjmuje takie polecenia (głupie tłumaczenie moim zdaniem - jeśli dana baza tego nie wspiera to po prostu nie byłoby użyte). Z własnego doświadczenia powiem Ci, że takie inserty dużo dadzą. Podobne rozwiązanie zastosowałem przy importowaniu kategorii z Allegro (ok. 25 000) i wrzucanie ich w paczkach (np. po 50) jest znacznie szybsze niż wrzucanie ich pojedynczo.
SnakeEater
Zrobiłem transakcje poprzez $conn->beginTransaction ale niewiele to dało, więc zrobię taką klasę i zobaczę jak działa.
wookieb
Oj dało dało. Bawię się w tworzenie tęczowych tablic i uwierz kop jest niesamowity. Może tobie nie dało kopa, ponieważ nie masz tabel w INNODB?
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.