He escrito scripts PHP para cargar de forma masiva los datos publicados por el volcado de datos de Stack Overflow. Importo millones de filas y no toma tanto tiempo.
Estos son algunos consejos:
-
No confíes en la confirmación automática. La sobrecarga de iniciar y confirmar una transacción para cada fila es enorme. Use transacciones explícitas y confirme después de cada 1000 filas (o más).
-
Use declaraciones preparadas. Dado que básicamente está haciendo las mismas inserciones miles de veces, puede preparar cada inserción antes de comenzar el ciclo y luego ejecutar durante el ciclo, pasando valores como parámetros. No sé cómo hacer esto con la biblioteca de la base de datos de CodeIgniter, tendrás que averiguarlo.
-
Ajuste MySQL para importar. Aumente los búferes de caché, etc. Consulte Velocidad de las declaraciones INSERT para más información.
-
Utilice CARGAR ARCHIVO DE DATOS. Si es posible. Es literalmente 20 veces más rápido que usar INSERT para cargar datos fila por fila. Entiendo si no puede porque necesita obtener la última identificación de inserción y así sucesivamente. Pero en la mayoría de los casos, incluso si lee el archivo CSV, lo reorganiza y lo escribe en varios archivos CSV temporales, la carga de datos sigue siendo más rápida que con INSERTAR.
-
Hazlo sin conexión. No ejecute tareas de ejecución prolongada durante una solicitud web. El límite de tiempo de una solicitud de PHP terminará el trabajo, si no es hoy, será el próximo martes cuando el trabajo sea un 10% más largo. En su lugar, haga que la solicitud web ponga en cola el trabajo y luego devuelva el control al usuario. Debe ejecutar la importación de datos como un proceso de servidor y periódicamente permitir que el usuario vislumbre la tasa de progreso. Por ejemplo, una forma económica de hacer esto es que su secuencia de comandos de importación genere "." a un archivo temporal, y luego el usuario puede solicitar ver el archivo temporal y seguir recargando en su navegador. Si quieres ponerte elegante, haz algo con Ajax.