into - ¿Cuál es la mejor manera de lograr insertos rápidos de grandes cantidades de datos en MySQL?
mysql import csv (6)
1. Asegúrate de usar una transacción.
Las transacciones eliminan
INSERT, SYNC-TO-DISK
fase de repetición y, en su lugar, todo el disco IO se realiza cuando COMPROMETE la transacción.
2. Asegúrate de utilizar la compresión de conexión
Texto sin procesar + secuencia comprimida GZip ~ = hasta un 90% de ahorro de ancho de banda en algunos casos.
3. Utilice la notación de inserción paralela cuando sea posible
INSERT INTO TableName(Col1,Col2) VALUES (1,1),(1,2),(1,3)
(Menos texto para enviar, acción más corta)
He escrito un programa en C para analizar grandes archivos XML y luego crear archivos con instrucciones de inserción. Algún otro proceso injeriría los archivos en una base de datos MySQL. Esta información servirá como un servicio de indexación para que los usuarios puedan encontrar documentos fácilmente.
He elegido InnoDB para la capacidad de bloqueo a nivel de fila. El programa C generará desde 500 hasta 5 millones de instrucciones de inserción en una invocación determinada.
¿Cuál es la mejor manera de obtener todos estos datos en la base de datos lo más rápido posible? La otra cosa a tener en cuenta es que el DB está en un servidor separado. ¿Vale la pena mover los archivos a ese servidor para acelerar los insertos?
EDITAR: Esta tabla realmente no se actualizará, pero las filas se eliminarán.
Haría al menos estas cosas de acuerdo con este enlace :
- Mueva los archivos allí y conéctese al socket Unix
- Genere, en lugar de INSERTS, un archivo LOAD DATA INFILE
- Desactivar índices durante la carga
MySQL con los formatos de tabla estándar es maravillosamente rápido, siempre y cuando se trate de una tabla de solo escritura; entonces la primera pregunta es si vas a actualizar o eliminar. Si no es así, no vaya con innosys; no hay necesidad de bloquearlo si solo está agregando. Puede truncar o cambiar el nombre del archivo de salida periódicamente para tratar el tamaño de la tabla.
Realmente depende del motor. Si está utilizando InnoDB, utilice transacciones (no puede evitarlas, pero si utiliza el compromiso automático, cada lote está implícitamente en su propio txn), pero asegúrese de que no sean ni demasiado grandes ni demasiado pequeños.
Si está utilizando MyISAM, las transacciones no tienen sentido. Puede lograr una mejor velocidad de inserción deshabilitando y habilitando índices, pero eso solo es bueno en una tabla vacía.
Si comienzas con una mesa vacía, generalmente es lo mejor.
LOAD DATA es un ganador en ambos sentidos.
Si no puede usar LOAD DATA INFILE como han sugerido otros, use consultas preparadas para inserciones.
- Use la herramienta mysqlimport o el comando LOAD DATA INFILE.
- Deshabilite temporalmente los índices que no necesita para la integridad de los datos