He leído un artículo que menciona que podemos lograr 60,000 inserciones por segundo usando la LOAD DATA IN FILE
instrucción, que lee de archivos csv e inserta los datos en una base de datos.
¿Por qué debería diferir de los insertos normales?
EDITAR:
reduje el viaje de ida y vuelta llamando a una sola INSERT
declaración:
INSERT INTO tblname
VALUES (NULL,2,'some text here0'),(NULL,2,'some text here1')
,(NULL,2,'some text here2'),(NULL,2,'some text here3')
.....,(NULL,2,'some text here3000');
¿Qué hay de esto?
LOAD DATA INFILE
: Inserciones de alta velocidad con MySQL . En pocas palabras: puede lograr el 65% del rendimiento delLOAD DATA INFILE
uso de inserciones extendidas. Obtuve 240,000 insertos / segundo en hardware moderno.Respuestas:
CARGAR DATOS DE DATOS e INSERTOS extendidos tienen sus distintas ventajas.
LOAD DATA INFILE está diseñado para la carga masiva de datos de la tabla en una sola operación junto con campanas y silbatos para realizar cosas como:
Se necesita menos sobrecarga para analizar
Por otro lado, si solo importa 100 filas en lugar de 1,000,000 filas, INSERT extendido es sensato.
Tenga en cuenta que mysqldump se diseñó alrededor de INSERT extendidos en aras de llevar el diseño de la tabla junto con los datos, ya que realiza la inyección de cientos o miles de filas por INSERT. LOAD DATA INFILE siempre crea una dicotomía física entre el esquema y los datos.
Desde el punto de vista de la aplicación, LOAD DATA INFILE también es más insensible al cambio de esquema que los INSERT extendidos.
Uno puede ir y venir de lo bueno, lo malo y lo feo de usar LOAD DATA INFILE. Independientemente de la técnica que utilice, siempre debe establecer el tamaño de bulto_insertado_de_búfer . ¿Por qué?
De acuerdo con la documentación de MySQL en bulk_insert_buffer_size:
Durante años, he visto cliente tras cliente no configurar esto y dejarlo en 8 MB. Luego, cuando deciden usar LOAD DATA INFILE o importar mysqldumps, pueden sentir que algo anda mal. Por lo general, recomiendo configurar esto a un moderado 256M. En algunos casos, 512M.
Una vez que tenga un búfer INSERT masivo lo suficientemente grande, el uso de cualquiera de las técnicas se convierte en académico y se reduce a la elección personal. Para aplicaciones en las que inserta INSERT de forma masiva solo 100 filas bajo demanda, quédese con INSERTs extendidos.
Para ser justos, decir LOAD DATA INFILE es más rápido que las declaraciones INSERT normales es una especie de declaración cargada principalmente porque la configuración no se tiene en cuenta. Incluso si configura un punto de referencia entre LOAD DATA INFILE y los INSERT extendidos con un tamaño adecuado de bulk_insert_buffer_size, los nanosegundos guardados al analizar cada fila solo pueden producir resultados nominales en el mejor de los casos a favor de LOAD DATA INFILE.
Continúe y agregue esto a my.cnf
También puede configurarlo solo para su sesión antes de lanzar INSERTs extendidos
ACTUALIZACIÓN 2012-07-19 14:58 EDT
Para mantener las cosas en perspectiva, el búfer de inserción masiva solo es útil para cargar tablas MyISAM, no InnoDB. Escribí una publicación más reciente sobre la carga masiva de InnoDB: la carga de Mysql desde el archivo atascado esperando en el disco duro
fuente
La mayoría de los sistemas de administración de bases de datos tienen una instalación de carga masiva para cargar grandes volúmenes de datos rápidamente. Una
INSERT
declaración tiene una cantidad significativa de equipaje por declaración: bloqueo, demarcación de transacciones, comprobaciones de integridad referencial, asignación de recursos, E / S que debe hacerse por declaración.Las operaciones de inserción masiva simplifican el proceso, por lo que este material tiene mucha, mucho menos sobrecarga por fila. Un DBMS puede cargar en masa pedidos de datos de magnitud más rápido que a través de instrucciones de inserción.
fuente
Analizar y ejecutar
INSERT
declaraciones individuales conlleva una sobrecarga mucho mayor que dividir un archivo CSV en columnas y cargarlas directamente.Cada
INSERT
declaración debe ser analizada individualmente por el motor MySQL y verificada su validez; esto consume recursos adicionales de la CPU y también requiere más viajes de ida y vuelta del servidor cliente <>. Esto no necesita suceder cuando se realiza una carga masiva a través deLOAD DATA INFILE
. También hay optimizaciones que pueden tener lugar cuando se usaLOAD DATA INFILE
para cargar en una tabla vacía. Vea este enlace para más información.fuente