Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [Symfony] Jak przyspieszyć dodawanie rekordów do bazy?
SnakeEater
post 7.04.2010, 12:53:23
Post #1





Grupa: Zarejestrowani
Postów: 50
Pomógł: 0
Dołączył: 12.03.2010

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 4)
destroyerr
post 7.04.2010, 13:08:22
Post #2





Grupa: Zarejestrowani
Postów: 879
Pomógł: 189
Dołączył: 14.06.2006
Skąd: Bytom

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
phpion
post 7.04.2010, 13:44:35
Post #3





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




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.
Go to the top of the page
+Quote Post
SnakeEater
post 7.04.2010, 14:04:57
Post #4





Grupa: Zarejestrowani
Postów: 50
Pomógł: 0
Dołączył: 12.03.2010

Ostrzeżenie: (0%)
-----


Zrobiłem transakcje poprzez $conn->beginTransaction ale niewiele to dało, więc zrobię taką klasę i zobaczę jak działa.
Go to the top of the page
+Quote Post
wookieb
post 7.04.2010, 14:12:59
Post #5





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




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?


--------------------
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 14.08.2025 - 10:14