Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: UPDATE szalonej ilości danych
Forum PHP.pl > Forum > Bazy danych > MySQL
marcinM97
Nawiązując jeszcze do tematu:
http://forum.php.pl/index.php?showtopic=23...p;#entry1126156

doradźcie mi proszę, jak zaktualizować ogromną ilość rekordów w bazie.
Mówiąc ogromną, mam na myśli co najmniej kilkadziesiąt tysięcy rekordów.
Stworzyłem zapytanie UPDATE przy pomocy pętli w PHPie, ale serwer się zawiesza.
Nawet gdyby się nie zawieszał, to czas oczekiwania na wykonanie jest nieakceptowalny.
lukasz_os
Dane do update obliczasz w php czy pobierasz z innej tabelki/innych tabelek?
Turson
Ogromna czyli ile?
marcinM97
Cytat(lukasz_os @ 24.09.2014, 11:18:29 ) *
Dane do update obliczasz w php czy pobierasz z innej tabelki/innych tabelek?



Cytat(Turson @ 24.09.2014, 11:20:48 ) *
Ogromna czyli ile?


Dane do update są pobierane z pliku csv. Potem są obrabiane w php i ostatecznie wrzucane do bazy.
Ogromna ilość oznacza od kilkudziesięciu tysięcy rekordów wzwyż. Ale w skrajnej sytuacji może ich być nawet około miliona.
zegarek84
update zrób w jednej transakcji (beginTransaction, end...) + wcześniej przegotuj zapytanie np. pdo prepare (ale ogólnie niemal każde połączenie z bazami coś takiego ma)...

ale swoją drogą chyba szybszy jest insert w jednej transakcji, więc zrób insert przygotowanym zapytaniem w jednej transakcji do tabeli tymczasowej po czym wykonaj jednym zapytaniem update z select (google "update from select" / "insert from select")
lukasz_os
zegarek84 ale to nic mu nie da bo serwer dalej bedzie sypal timeoutem. Najlepsze rozwiązanie to skrypt php odpalic z poziomu konsoli - wtedy nie jestes ograniczony przez przeglądarkę.
zegarek84
Cytat(lukasz_os @ 24.09.2014, 13:33:28 ) *
zegarek84 ale to nic mu nie da bo serwer dalej bedzie sypal timeoutem. Najlepsze rozwiązanie to skrypt php odpalic z poziomu konsoli - wtedy nie jestes ograniczony przez przeglądarkę.

powiedzmy, tylko tak naprawdę zależy jak to robił gdyż przyśpieszenie jest znaczne niż przy każdym z update z osobna... podobnie do wczytywania plików nawet ten csv jeśli od razu będzie chciał wczytać do pamięci np. przez file to nie dość, że ramu więcej potrzebuje ale i wykonuje niepotrzebnie wolną operację... podobnie jest z plikami xml gdzie strukturę znamy a wielu buduje DOM bo łatwiej zamiast skorzystać z SAX (jednak programowania zdarzeniowego mało kto chce ruszać) -> z pliku csv powinien czytać linia po lini i od razu wgrywać do bazy... pomijając fakt, że na serwerze może zwiększyć czas wykonywania skryptu w przeglądarce, to są też sposoby by skrypt dalej wykonywał się mimo zamknięcia przeglądarki, lub odesłać odpowiedź do przeglądarki żeby wyglądało, że gotowe i zrobić co trzeba na serwerze w reszcie czasu bądź zadanie potem przydzielić do crona i dać gdzieś znacznik co i gdzie się wgrało (w przeszłości interesowałem się deamon'ami w PHP ale teraz hobbistycznie wolę C++)
Pyton_000
Jeżeli dane z CSV mają jakiś klucz który jest kluczem unikalnym w BD możesz zrobić INSERT INTO ... ON DUPLICATE KEY UPDATE, a do tego robić multi insert czyli zgrupować po np. 1tyś wsadów na raz.

Jeżeli chcesz możesz jeszcze na czas robienia UPDATE wyłączyć klucze i po całym wsadzie je przebudować:
  1. ALTER TABLE cars DISABLE KEYS;
  2.  
  3. INSERT INTO cars ...
  4. ...
  5. ...
  6. INSERT INTO cars ...
  7.  
  8. ALTER TABLE search_all_values ENABLE KEYS;
  9.  
  10. OPTIMIZE TABLE cars;
marcinM97
Dziękuję za wartościową dyskusję.
Wasze podpowiedzi rozjaśniły mi światopogląd w tym temacie.
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.