Estoy cargando un archivo de 100GB a través de LOAD DATA INFILE. He tenido buen éxito con MyISAM, unas pocas horas y listo.
Lo estoy intentando ahora usando InnoDB. La carga comienza rápidamente a más de 10 MB / s (ver el crecimiento del archivo de la tabla, file_per_table
está activada).
Pero después de aproximadamente 5 GB de datos, se ralentiza al rango de 2-4 MB / seg., Cuando obtengo más de 20 GB, disminuía alrededor de 2 MB / seg.
El tamaño de las agrupaciones de almacenamiento intermedio de InnoDB es 8G. Y he hecho lo siguiente antes de ejecutar el comando LOAD DATA INFILE:
SET @@session.sql_log_bin=0;
SET autocommit=0;
SET unique_checks=0;
SET foreign_key_checks=0;
alter table item_load disable keys;
//Run LOAD DATA INFILE....
No puedo ver la razón por la cual está comenzando bien y disminuyendo con el tiempo.
Además, usando la misma configuración, ejecuté el mismo comando LOAD DATA INFILE con la tabla usando InnoDB y MyISAM y un conjunto de datos de prueba de 5GB, MyISAM fue 20 veces más rápido:
InnoDB:
mysql> LOAD DATA CONCURRENT LOCAL INFILE '/tmp/item' REPLACE INTO TABLE item_load;
Query OK, 2630886 rows affected, 6 warnings (21 min 25.38 sec)
Records: 2630886 Deleted: 0 Skipped: 0 Warnings: 6
MyISAM:
mysql> LOAD DATA CONCURRENT LOCAL INFILE '/tmp/item' REPLACE INTO TABLE item_load;
Query OK, 2630886 rows affected, 6 warnings (1 min 2.52 sec)
Records: 2630886 Deleted: 0 Skipped: 0 Warnings: 6
¿Algo más que deba considerar intentar? El motor MyISAM puede mantener la velocidad de carga mucho mejor.
Detalles adicionales:
He intentado cargar los archivos individualmente, no hay diferencia.
Por cierto, tengo 150 archivos de 500 MB cada uno, dentro de cada archivo se ordenan las claves.
Después de obtener 40 GB durante la noche, 12 horas después, la velocidad de carga se redujo a 0.5 MB / seg, lo que significa que la operación es, prácticamente hablando, imposible.
No he encontrado ninguna otra respuesta a preguntas similares en otros foros, me parece que InnoDB no admite cargar grandes cantidades de datos en tablas de más de unos pocos GB.
fuente
La respuesta final a esta pregunta fue no usar InnoDB para una tabla de referencia masiva. MyISAM está gritando rápidamente, casi el rendimiento total de la velocidad del disco para toda la carga, InnoDB se atasca. MyISAM es simple, pero en este caso también lo son los requisitos de esta tabla. Para una tabla de referencia simple con cargas masivas sobre LOAD DATA INFILE, MyISAM es el camino a seguir, hasta ahora todo bien.
Pero tenga en cuenta que si ejecuta las tablas MyISAM e InnoDB, tendrá que considerar la asignación de memoria para 2 mecanismos de almacenamiento en caché, cada motor tiene su propio almacenamiento en caché único que necesita una asignación de memoria separada.
fuente
Puede intentar dividir sus archivos de entrada en fragmentos más pequeños.
Yo personalmente uso http://www.percona.com/doc/percona-toolkit/2.1/pt-fifo-split.html para esto.
¿Qué sucede si obtiene un bloqueo de tabla por tabla durante la importación? Tal vez el bloqueo de nivel de fila de InnoDB lo ralentiza (MyISAM usa un bloqueo de tabla).
También puede leer aquí para obtener más ideas: http://derwiki.tumblr.com/post/24490758395/loading-half-a-billion-rows-into-mysql
fuente
Si su PK no es AUTO_INCREMENT o los datos en el archivo csv no están ordenados en PK, podría estar afectando el rendimiento de la carga de datos. Dado que la tabla en MySQL es un índice, por lo tanto, todos los datos se almacenan en orden ordenado, si el valor PK no está en AUTO_INCREMENT, entonces MySQL tiene que hacer muchos cambios de datos para obtener los datos almacenados en orden ordenado. Esta es la razón de una carga de datos más lenta cuando el tamaño de la tabla comienza a crecer.
Estoy cargando un archivo csv de 91GB con PK en AUTO_INCREMENT usando LOAD DATA INFILE y no veo ninguna caída en mi rendimiento. Estoy obteniendo insertos de 140K a 145K por segundo. Usando Percona MySQL 5.6.38
fuente