Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> UPDATE szalonej ilości danych
marcinM97
post
Post #1





Grupa: Zarejestrowani
Postów: 12
Pomógł: 0
Dołączył: 23.09.2014

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


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.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 8)
lukasz_os
post
Post #2





Grupa: Zarejestrowani
Postów: 203
Pomógł: 55
Dołączył: 23.11.2008
Skąd: UKF

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


Dane do update obliczasz w php czy pobierasz z innej tabelki/innych tabelek?
Go to the top of the page
+Quote Post
Turson
post
Post #3





Grupa: Zarejestrowani
Postów: 4 291
Pomógł: 829
Dołączył: 14.02.2009
Skąd: łódź

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


Ogromna czyli ile?
Go to the top of the page
+Quote Post
marcinM97
post
Post #4





Grupa: Zarejestrowani
Postów: 12
Pomógł: 0
Dołączył: 23.09.2014

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


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.
Go to the top of the page
+Quote Post
zegarek84
post
Post #5





Grupa: Zarejestrowani
Postów: 1 332
Pomógł: 294
Dołączył: 12.10.2008
Skąd: Olkusz

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


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")
Go to the top of the page
+Quote Post
lukasz_os
post
Post #6





Grupa: Zarejestrowani
Postów: 203
Pomógł: 55
Dołączył: 23.11.2008
Skąd: UKF

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


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ę.
Go to the top of the page
+Quote Post
zegarek84
post
Post #7





Grupa: Zarejestrowani
Postów: 1 332
Pomógł: 294
Dołączył: 12.10.2008
Skąd: Olkusz

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


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++)
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%)
-----


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;
Go to the top of the page
+Quote Post
marcinM97
post
Post #9





Grupa: Zarejestrowani
Postów: 12
Pomógł: 0
Dołączył: 23.09.2014

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


Dziękuję za wartościową dyskusję.
Wasze podpowiedzi rozjaśniły mi światopogląd w tym temacie.
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: 24.08.2025 - 14:43