Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> MySQL UPDATE dużej ilości rekordow
northwest
post
Post #1





Grupa: Zarejestrowani
Postów: 788
Pomógł: 1
Dołączył: 17.09.2004

Ostrzeżenie: (10%)
X----


Witam serdecznie,
Mam do zaktualizowania ok 70.000 rekordów - parę razy dziennie.
Mój aktualny skrypt wygląda następująco:
  1. $pobrany_plik_csv = $www_plik;
  2. $url_pliku = 'http://'.$www_login.':'.$www_haslo.'@'.$www_domena_oraz_sciezka;
  3. $db->query("UPDATE cms_produkty SET ilosc = '0' WHERE ate <> '0';");
  4.  
  5. file_put_contents($www_plik, fopen($url_pliku, 'r'));
  6. $e = null;
  7. $e2 = null;
  8. $licze = 0;
  9. $plik = fopen($www_plik, "r");
  10. while( $wiersz = fgetcsv($plik, 4000, ",") )
  11. {
  12. if($wiersz['1'] !="0") {
  13. if($wiersz[1] == "") $wiersz[1] = 0;
  14.  
  15. if($licze <= 5){
  16. $licze = $licze + 1;
  17. $result = mysql_query(" UPDATE cms_produkty SET ilosc = '$wiersz[1]' WHERE ate = '$wiersz[0]'; ") or die('Query failed: ' . mysql_error());
  18. }
  19. if($licze == 5){
  20. $licze = 0;
  21. $e2 = null;
  22.  
  23. }
  24.  
  25. }
  26. }
  27. ?>


Skrypt pobiera plik poprawnie z 2 serwera jednak wykonywanie jogo trwa ok 30 minut i kończy się komunikatem: Blad w polaczeniu z baza danych [Too many connections]

Wie ktoś może dlaczego?
Bardzo proszę o pomoc:)
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 8)
phpion
post
Post #2





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




Wrzucaj dane do tabeli tymczasowej bezpośrednio z CSV za pomocą LOAD DATA (błyskawiczna operacja). Następnie 1 zapytaniem aktualizuj w tabeli właściwej danymi z tabeli tymczasowej. Zużyjesz mniej pamięci, a i sama aktualizacja danych będzie przebiegała znacznie szybciej.
Go to the top of the page
+Quote Post
northwest
post
Post #3





Grupa: Zarejestrowani
Postów: 788
Pomógł: 1
Dołączył: 17.09.2004

Ostrzeżenie: (10%)
X----


Dziękuję za odpowiedź (IMG:style_emoticons/default/smile.gif) mogę prosić jakiś przykład??(IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
phpion
post
Post #4





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




Przykład? LOAD DATA znajdziesz w manualu MySQL. Przerzucenie danych z tabeli do tabeli to:
  1. INSERT INTO tabela1 (kolumna1, kolumna2) SELECT kolumna1, kolumna2 FROM tabela2

Pozostałe aspekty zależą od konkretnego przypadku.
Go to the top of the page
+Quote Post
northwest
post
Post #5





Grupa: Zarejestrowani
Postów: 788
Pomógł: 1
Dołączył: 17.09.2004

Ostrzeżenie: (10%)
X----


dzięki za odpowiedź (IMG:style_emoticons/default/smile.gif)
Kombinuję zrobić tak jak piszesz, ale zwraca mi to too manyy connections (IMG:style_emoticons/default/sad.gif)
UPDATE cms_produkty SET ilosc = CASE ate WHEN 1000 THEN 58 ELSE ilosc END WHERE ate IN ( 1000);
próbuję takim poleceniem, jednak nie wyświetla mi błędu - a aktualizacji nie przeprowadza (IMG:style_emoticons/default/sad.gif)

Wiesz może dlaczego?
Go to the top of the page
+Quote Post
Pyton_000
post
Post #6





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


jeżeli 'ate' unique to możesz użyć też składni
  1. INSERT INTO ... ON DUPICATE KEY UPDATE
Go to the top of the page
+Quote Post
northwest
post
Post #7





Grupa: Zarejestrowani
Postów: 788
Pomógł: 1
Dołączył: 17.09.2004

Ostrzeżenie: (10%)
X----


nie pomogło, kombinuję z czymś takim:

  1. file_put_contents($www_plik, fopen($url_pliku, 'r'));
  2. $e = null;
  3. $e2 = null;
  4. $licze = 0;
  5. $plik = fopen($www_plik, "r");
  6. while( $wiersz = fgetcsv($plik, 4000, ",") )
  7. {
  8. if($wiersz['1'] !="0") {
  9. if($wiersz[1] == "") $wiersz[1] = 0;
  10. mysql_query(" INSERT INTO cms_temer (nazwa, ilosc) VALUES ($wiersz[0], $wiersz[1]); ") or die('Query failed: ' . mysql_error());
  11. }
  12. }
  13.  
  14.  
  15. $update1 = null;
  16. $update2 = null;
  17. $update3 = null;
  18. $iillee = 0;
  19. $wynik = mysql_query(" SELECT * FROM cms_temer ;") or die('Query failed: ' . mysql_error());
  20. while($rek = mysql_fetch_array($wynik)) {
  21. if($iillee < 200) {
  22. $update .= " UPDATE cms_produkty SET ilosc = '$rek[ilosc]' WHERE ate = '$rek[nazwa]'; ";
  23. $update1 .= " WHEN $rek[nazwa] THEN '$rek[ilosc]' ";
  24. $update2 .= " $rek[nazwa], ";
  25. $update3 .=
  26. $iillee = $iillee + 1;
  27. }
  28. if($iillee == 200){
  29. $update2 = substr($update2, 0, -3);
  30. $qqqqqq = "UPDATE cms_produkty SET ilosc = CASE ate
  31. $update1
  32. ELSE ilosc END
  33. WHERE ate IN ($update2);
  34. ";
  35. mysql_query($qqqqqq);
  36. $update1 = null;
  37. $update2 = null;
  38. $update3 = null;
  39. $iillee = 0;
  40. }
  41. }


ale też nie wchodzi (IMG:style_emoticons/default/sad.gif) firma hostingowa mówi że mam za dużo zapytań do bazy danych i stąd problem.... :/
Macie może jakiś pomysł na optymalizację tego??(IMG:style_emoticons/default/sad.gif)

Ten post edytował northwest 17.12.2013, 22:26:39
Go to the top of the page
+Quote Post
Pyton_000
post
Post #8





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


pokaż dump struktury bazy
Go to the top of the page
+Quote Post
phpion
post
Post #9





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




Cytat(northwest @ 17.12.2013, 22:26:05 ) *
ale też nie wchodzi (IMG:style_emoticons/default/sad.gif) firma hostingowa mówi że mam za dużo zapytań do bazy danych i stąd problem.... :/
Macie może jakiś pomysł na optymalizację tego??(IMG:style_emoticons/default/sad.gif)

Przecież Ci napisałem: całość zamkniesz w kilku zapytaniach. We wklejonym kodzie nie widzę byś kombinował z LOAD DATA o czym Ci pisałem. Nadal walisz zapytania w pętli to się nie dziw, że Ci się wykrzacza przy dużej liczbie danych.

Swoją drogą: "Too many connections" dotyczy przekroczonej liczby połączeń z bazą danych, a nie wykonywanych zapytań.
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 23.08.2025 - 21:32