2010-03-17 50 views
21

a veces, tengo que volver a importar datos para un proyecto, leyendo 3.6 millones de filas en una tabla MySQL (actualmente InnoDB, pero en realidad no estoy limitado a este motor). "Cargar archivo de datos ..." ha demostrado ser la solución más rápida, sin embargo tiene una compensación: - al importar sin claves, la importación en sí tarda unos 45 segundos, pero la creación de claves lleva años (ya se ejecuta durante 20 minutos. ..). - importar con claves en la tabla hace que la importación sea mucho más lentaCarga de datos MySQL infile - ¿aceleración?

Hay claves en 3 campos de la tabla, haciendo referencia a los campos numéricos. ¿Hay alguna forma de acelerar esto?

Otro problema es que cuando finalizo el proceso que ha iniciado una consulta lenta, continúa ejecutándose en la base de datos. ¿Hay alguna forma de finalizar la consulta sin reiniciar mysqld?

Muchas gracias DBA

+0

¿Qué tan grandes son los registros? – Grumpy

+0

alrededor de 60 a 100 bytes, de 5 a 8 campos. Nada realmente grande, es la gran cantidad lo que hace que todo sea más lento. – DBa

Respuesta

38

si está usando innodb y cargando a granel aquí hay algunos consejos:

ordene su archivo csv en el orden de la clave principal de la tabla de destino: recuerde que innodb usa teclas primarias agrupadas por lo que se cargará más rápido si se clasifica!

típico archivo de entrada de datos de carga i uso:

truncate <table>; 

set autocommit = 0; 

load data infile <path> into table <table>... 

commit; 

otras optimizaciones que se pueden utilizar para aumentar el tiempo de carga:

set unique_checks = 0; 
set foreign_key_checks = 0; 
set sql_log_bin=0; 

dividir el archivo csv en trozos más pequeños

estadísticas típicas de importación i haber observado durante cargas a granel:

3.5 - 6.5 million rows imported per min 
210 - 400 million rows per hour 
+0

La desactivación de unique_checks ya mejoró el rendimiento, así como la clasificación por clave principal. Gracias! – DBa

1

InnoDB es un motor bastante bueno. Sin embargo, depende mucho de estar "sintonizado". Una cosa es que si las inserciones no están en el orden de aumentar las claves primarias, innoDB puede tardar un poco más que MyISAM. Esto se puede superar fácilmente estableciendo un valor mayor de innodb_buffer_pool_size. Mi sugerencia es establecerlo en 60-70% de su RAM total en una máquina MySQL dedicada.

Cuestiones relacionadas