Mieliśmy podobną sytuację. Po wielu próbach ulepszenia skryptu zdecydowaliśmy, że potrzebujemy innego podejścia, aby nasz import działał i nie zabierał ~10 godzin.
Zrzuciliśmy cały kod PHP i zamiast tego użyliśmy mysqlimport
aby załadować zawartość pliku CSV bezpośrednio do tabeli. Ta tabela zawiera teraz wszystko, czego potrzebujemy, ale nie w formie, która byłaby dla nas przydatna (bez struktury, niektóre pola wymagają przetwarzania itp.)
Ponieważ jednak wszystko jest teraz w bazie danych, możemy zrobić wszystko, co chcemy z zapytaniem. Na przykład usunięcie wszystkich danych, których nie ma już w pliku importu, to po prostu DELETE FROM structured_table AS st LEFT JOIN unstructured_table AS ut ON st.someField = ut.someField WHERE ut.someField IS NULL;
, aktualizacja istniejących rekordów to po prostu UPDATE structured_table AS st INNER JOIN unstructured_table AS ut ON st.someField = ut.someField SET st.anotherField = CONCAT(ut.aField, ' ', ut.yetAnotherField);
.
Oczywiście w przypadku złożonego skryptu importu Twoje zapytania będą bardziej złożone i będziesz ich potrzebować więcej. Może być nawet konieczne wrzucenie niektórych procedur składowanych w celu przetwarzania poszczególnych pól. Ale jeśli potrafisz przyjąć takie podejście, otrzymasz proces, który może obsłużyć wiele danych i jest bardzo skalowalny.