Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: MySQL UPDATE dużej ilości rekordow
Forum PHP.pl > Forum > PHP
northwest
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:)
phpion
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.
northwest
Dziękuję za odpowiedź smile.gif mogę prosić jakiś przykład??smile.gif
phpion
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.
northwest
dzięki za odpowiedź smile.gif
Kombinuję zrobić tak jak piszesz, ale zwraca mi to too manyy connections 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 sad.gif

Wiesz może dlaczego?
Pyton_000
jeżeli 'ate' unique to możesz użyć też składni
  1. INSERT INTO ... ON DUPICATE KEY UPDATE
northwest
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 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??sad.gif
Pyton_000
pokaż dump struktury bazy
phpion
Cytat(northwest @ 17.12.2013, 22:26:05 ) *
ale też nie wchodzi 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??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ń.
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.