Napisałem skrypty PHP do zbiorczego ładowania danych publikowanych przez zrzut danych Stack Overflow. Importuję miliony wierszy i nie trwa to tak długo.
Oto kilka wskazówek:
-
Nie polegaj na automatycznym zatwierdzaniu. Narzut związany z rozpoczęciem i realizacją transakcji dla każdego wiersza jest ogromny. Używaj jawnych transakcji i zatwierdzaj co 1000 wierszy (lub więcej).
-
Używaj przygotowanych oświadczeń. Ponieważ w zasadzie robisz te same wstawki tysiące razy, możesz przygotować każdą wstawkę przed rozpoczęciem pętli, a następnie wykonać ją w trakcie pętli, przekazując wartości jako parametry. Nie wiem, jak to zrobić z biblioteką baz danych CodeIgniter, musisz to rozgryźć.
-
Dostrój MySQL do importu. Zwiększ bufory pamięci podręcznej i tak dalej. Zobacz Szybkość instrukcji INSERT aby uzyskać więcej informacji.
-
Użyj LOAD DATA INFILE. Jeśli to możliwe. To dosłownie 20 razy szybsze niż użycie INSERT do ładowania danych wiersz po wierszu. Rozumiem, jeśli nie możesz, ponieważ musisz uzyskać ostatni identyfikator wkładki i tak dalej. Ale w większości przypadków, nawet jeśli odczytasz plik CSV, zmienisz jego kolejność i zapiszesz w wielu tymczasowych plikach CSV, ładowanie danych jest nadal szybsze niż przy użyciu INSERT.
-
Zrób to offline. Nie uruchamiaj długotrwałych zadań podczas żądania internetowego. Limit czasowy żądania PHP zakończy zadanie, jeśli nie dzisiaj, to w przyszły wtorek, gdy zadanie będzie dłuższe o 10%. Zamiast tego ustaw żądanie sieciowe w kolejce zadania, a następnie zwróć kontrolę użytkownikowi. Importowanie danych należy uruchamiać jako proces serwera i okresowo pozwalać użytkownikowi na zobaczenie tempa postępu. Na przykład tanim sposobem na zrobienie tego jest użycie skryptu importu do wypisania „.” do pliku tymczasowego, a następnie użytkownik może zażądać wyświetlenia pliku tymczasowego i ponownego ładowania w przeglądarce. Jeśli chcesz wymyślić, zrób coś z Ajaxem.