Tuvimos una situación similar. Después de muchos intentos de mejorar la secuencia de comandos, decidimos que necesitábamos otro enfoque para que nuestra importación funcionara y no tomara ~10 horas.
Lo que hicimos fue volcar todo el código PHP y, en su lugar, usar mysqlimport
para cargar el contenido del archivo CSV directamente en una tabla. Esa tabla ahora contiene todo lo que necesitamos, pero no en una forma que sea útil para nosotros (sin estructura, algunos campos necesitan algún procesamiento, etc.)
Sin embargo, debido a que ahora todo está en la base de datos, podemos hacer todo lo que queramos con una consulta. Por ejemplo, eliminar todos los datos que ya no están en el archivo de importación, eso es solo DELETE FROM structured_table AS st LEFT JOIN unstructured_table AS ut ON st.someField = ut.someField WHERE ut.someField IS NULL;
, actualizar los registros existentes es simplemente UPDATE structured_table AS st INNER JOIN unstructured_table AS ut ON st.someField = ut.someField SET st.anotherField = CONCAT(ut.aField, ' ', ut.yetAnotherField);
.
Obviamente, para un script de importación complejo, sus consultas serán más complejas y necesitará más de ellas. Incluso es posible que deba incluir algunos procedimientos almacenados para realizar el procesamiento en campos individuales. Pero si puede adoptar este tipo de enfoque, terminará con un proceso que puede manejar una gran cantidad de datos y es muy escalable.