![]() |
![]() |
![]()
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. |
|
|
![]() |
![]()
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?
|
|
|
![]()
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?
|
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 12 Pomógł: 0 Dołączył: 23.09.2014 Ostrzeżenie: (0%) ![]() ![]() |
Dane do update obliczasz w php czy pobierasz z innej tabelki/innych tabelek? 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. |
|
|
![]()
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") |
|
|
![]()
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ę.
|
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 1 332 Pomógł: 294 Dołączył: 12.10.2008 Skąd: Olkusz 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ę. 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++) |
|
|
![]()
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ć:
|
|
|
![]()
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. |
|
|
![]() ![]() |
![]() |
Aktualny czas: 24.08.2025 - 14:43 |