Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Potrzebujesz wydajnej czasowo metody importowania dużego pliku CSV za pośrednictwem PHP do wielu tabel MySQL

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak zmienić typ danych dla kolumny w MySQL?

  2. Jak rekursywnie usuwać elementy z tabeli?

  3. Wyniki autouzupełniania pól tekstowych na podstawie bazy danych SQL

  4. Ograniczenie klucza obcego nie działa

  5. Boolean vs tinyint(1) dla wartości logicznych w MySQL