Saltar al contenido

¿Por qué ‘LOAD DATA INFILE’ es más rápido que las declaraciones INSERT normales?

Solución:

LOAD DATA INFILE y los INSERT extendidos tienen sus distintas ventajas.

LOAD DATA INFILE está diseñado para la carga masiva de datos de tablas en una sola operación junto con campanas y silbidos para realizar tareas como:

  • Saltarse las líneas iniciales
  • Omitir columnas específicas
  • Transformar columnas específicas
  • Carga de columnas específicas
  • Manejo de problemas de claves duplicadas

Se necesita menos sobrecarga para analizar

Por otro lado, si solo está importando 100 filas en lugar de 1,000,000 filas, INSERT extendido es sensato.

Tenga en cuenta que mysqldump se diseñó en torno a INSERTs extendidos con el fin de llevar el diseño de la tabla junto con los datos a medida que realiza la inyección de cientos o miles de filas por INSERT. LOAD DATA INFILE siempre crea una dicomotía física entre esquema y 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 sobre lo bueno, lo malo y lo feo de usar LOAD DATA INFILE. Independientemente de la técnica que utilice, siempre debe configurar el bulk_insert_buffer_size. ¿Por qué?

De acuerdo con la documentación de MySQL sobre bulk_insert_buffer_size:

MyISAM usa un caché especial en forma de árbol para hacer inserciones masivas más rápidas para INSERT … SELECT, INSERT … VALUES (…), (…), …, y LOAD DATA INFILE al agregar datos a no vacíos mesas. Esta variable limita el tamaño del árbol de caché en bytes por hilo. Establecerlo en 0 deshabilita esta optimización. El valor predeterminado es 8 MB.

Durante años, he visto cliente tras cliente que no configuran esto y lo dejan 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 en un moderado 256M. En algunos casos, 512M.

Una vez que tenga un búfer INSERT a granel lo suficientemente grande, el uso de cualquiera de las técnicas se vuelve académico y se reduce a una elección personal. Para aplicaciones en las que inserta a granel solo 100 filas a pedido, quédese con INSERT 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 bulk_insert_buffer_size adecuado, los nanosegundos ahorrados 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

[mysqld]
bulk_inset_buffer_size=256M

También puede configurarlo solo para su sesión antes de iniciar INSERT extendidos

SET bulk_insert_buffer_size= 1024 * 1024 * 256;

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: Mysql load from infile atascado esperando en el disco duro

La mayoría de los sistemas de administración de bases de datos tienen una función de carga masiva para cargar grandes volúmenes de datos rápidamente. Un INSERT La declaración tiene una cantidad significativa de equipaje por declaración: bloqueo, demarcación de transacciones, verificaciones de integridad referencial, asignación de recursos, E / S que debe realizarse por declaración.

Las operaciones de inserción masiva agilizan el proceso, por lo que estas cosas tienen mucho, mucho menos gastos generales por fila. Un DBMS puede cargar de forma masiva órdenes de magnitud de datos más rápido que a través de declaraciones de inserción.

Analizando y ejecutando individuo INSERT Las declaraciones conllevan una sobrecarga mucho mayor que dividir un archivo CSV en columnas y cargarlas directamente.

Cada INSERT La declaración debe ser analizada individualmente por el motor MySQL y verificada para verificar su validez; esto consume recursos adicionales de la CPU y también requiere más viajes de ida y vuelta cliente <> servidor. Esto no tiene por qué suceder cuando se carga a granel a través de LOAD DATA INFILE. También hay optimizaciones que pueden tener lugar al usar LOAD DATA INFILE para cargar en una mesa vacía. Mira este link para más información.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *