Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Proceso automático para insertar 50000 registros en una base de datos MySQL

Estas en el tema de Proceso automático para insertar 50000 registros en una base de datos MySQL en el foro de Mysql en Foros del Web. Hola, me gustaría saber como puedo realizar un proceso automático para insertar cincuenta mil registros en una base de datos MySQL. He hecho un stored ...
  #1 (permalink)  
Antiguo 08/04/2009, 09:52
 
Fecha de Ingreso: octubre-2008
Mensajes: 276
Antigüedad: 15 años, 6 meses
Puntos: 1
Proceso automático para insertar 50000 registros en una base de datos MySQL

Hola, me gustaría saber como puedo realizar un proceso automático para insertar cincuenta mil registros en una base de datos MySQL.

He hecho un stored procedure para llevar a cabo esto, lo ejecuto y luego de 20 minutos o más el proceso no termina por lo que tengo que cerrar mi cliente.

Sin embargo si pruebo con diez mil registros si que se termina de ejecutar.

¿Estoy haciendo algo mal?

Saludos.
__________________
Uso Apache 2.2 con PHP 5.5.9 y MySQL 5.1
Uso Eclipse IDE for Java Developers, Version: Mars.1 Release (4.5.1), Build id: 20150924-1200 para programar en Java bajo Windows

Última edición por letni; 08/04/2009 a las 10:29
  #2 (permalink)  
Antiguo 08/04/2009, 09:55
Avatar de Genetix  
Fecha de Ingreso: febrero-2002
Ubicación: Lima - Perú
Mensajes: 1.600
Antigüedad: 22 años, 2 meses
Puntos: 45
Respuesta: Proceso automático para insertar 100000 registros en una base de datos MyS

Que comandos o funciones usas para insertarlo?
__________________
"El conocimiento nos hace responsables."
twitter: @benjamingb
blog personal: http://codigolinea.com
ZF Manual en español http://manual.zfdes.com
  #3 (permalink)  
Antiguo 08/04/2009, 10:02
 
Fecha de Ingreso: octubre-2008
Mensajes: 276
Antigüedad: 15 años, 6 meses
Puntos: 1
Respuesta: Proceso automático para insertar 100000 registros en una base de datos MyS

Utilizo este stored procedure:

Código mysql:
Ver original
  1. delimiter //
  2.  
  3. CREATE PROCEDURE dorepeat(p1 INT)
  4.   SET @a = 0;
  5.   REPEAT
  6.     SET @a = @a + 1;
  7.     insert into foo values (@a, CONCAT("bar no. ", @a));
  8.   UNTIL @a > p1 END REPEAT;
  9. //

luego lo ejecuto con call dorepeat(50000);
__________________
Uso Apache 2.2 con PHP 5.5.9 y MySQL 5.1
Uso Eclipse IDE for Java Developers, Version: Mars.1 Release (4.5.1), Build id: 20150924-1200 para programar en Java bajo Windows

Última edición por letni; 08/04/2009 a las 10:29
  #4 (permalink)  
Antiguo 08/04/2009, 10:19
 
Fecha de Ingreso: octubre-2008
Mensajes: 276
Antigüedad: 15 años, 6 meses
Puntos: 1
Respuesta: Proceso automático para insertar 100000 registros en una base de datos MyS

Era cuestión de tiempo (casi 37 minutos), he aquí el resultado que me ha dado el cliente MySQL:

Código:
(1 row(s) affected)
Execution Time : 00:36:54:766
Transfer Time  : 00:00:00:000
Total Time     : 00:36:54:766
12,3 horas si inserto el millón de registros que tenía pensado.
__________________
Uso Apache 2.2 con PHP 5.5.9 y MySQL 5.1
Uso Eclipse IDE for Java Developers, Version: Mars.1 Release (4.5.1), Build id: 20150924-1200 para programar en Java bajo Windows

Última edición por letni; 08/04/2009 a las 10:30
  #5 (permalink)  
Antiguo 16/04/2009, 12:03
 
Fecha de Ingreso: octubre-2008
Mensajes: 276
Antigüedad: 15 años, 6 meses
Puntos: 1
Respuesta: Proceso automático para insertar 50000 registros en una base de datos MySQ

¿Nadie sabe el por qué de la lentitud?
__________________
Uso Apache 2.2 con PHP 5.5.9 y MySQL 5.1
Uso Eclipse IDE for Java Developers, Version: Mars.1 Release (4.5.1), Build id: 20150924-1200 para programar en Java bajo Windows
  #6 (permalink)  
Antiguo 16/04/2009, 13:17
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Proceso automático para insertar 50000 registros en una base de datos MySQ

Porque estás insertando uno a uno los registros, y con cada INSERT se actualiza el índice... Es una tarea muy lenta.
Hay dos formas básicas de acelerar el proceso, pero ambas se tienen que implementar desde código de aplicación:
1. Usando LOAD DATA INFILE, que requiere que los datos se vuelquen primero a un archivo plano, separado por comas. Colo el LOAD DATA no opera dentro de los store procedures, no puedes crear uno para este treabajo.
2. Usando inserciones múltiples. Es el caso de crear una inmensa cadena en la aplicación con muchos VALUES a insertar en una sola ejecución:
Código sql:
Ver original
  1. INSERT INTO Tabla1(campos)
  2. VALUES(valores), (valores), (valores), (valores), (valores),
  3.     (valores), (valores), (valores);
Yo personalmente, he manejado inserciones múltiples de 50 registros, de 100 y de hasta un millar, sin mayores problema. Depende del tamaño del buffer.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 16/04/2009, 13:21
 
Fecha de Ingreso: octubre-2008
Mensajes: 276
Antigüedad: 15 años, 6 meses
Puntos: 1
Respuesta: Proceso automático para insertar 50000 registros en una base de datos MySQ

Pero el método de las inserciones múltiples requiere que meta a mano los valores que van a tomar los campos, si tengo que hacer eso con un millón de registros sí que me eternizo más que con lo otro.

La gracia está en que se generen sólos los campos de los registros para que sea un proceso automático.

No se si me explico.

Saludos.
__________________
Uso Apache 2.2 con PHP 5.5.9 y MySQL 5.1
Uso Eclipse IDE for Java Developers, Version: Mars.1 Release (4.5.1), Build id: 20150924-1200 para programar en Java bajo Windows
  #8 (permalink)  
Antiguo 16/04/2009, 14:07
Avatar de DBMark  
Fecha de Ingreso: mayo-2008
Ubicación: Oxford
Mensajes: 35
Antigüedad: 16 años
Puntos: 6
Respuesta: Proceso automático para insertar 50000 registros en una base de datos MySQ

¿Podrias borrar el indice antes de insertar los registros? Luego crear de nuevo el indice cuando has insertado todos. Seria mucho mas rapido...
  #9 (permalink)  
Antiguo 16/04/2009, 14:13
 
Fecha de Ingreso: octubre-2008
Mensajes: 276
Antigüedad: 15 años, 6 meses
Puntos: 1
Respuesta: Proceso automático para insertar 50000 registros en una base de datos MySQ

He borrado el índice y se está insertando el millón de registros, luego si acaba pongo el resultado.

Saludos.
__________________
Uso Apache 2.2 con PHP 5.5.9 y MySQL 5.1
Uso Eclipse IDE for Java Developers, Version: Mars.1 Release (4.5.1), Build id: 20150924-1200 para programar en Java bajo Windows
  #10 (permalink)  
Antiguo 16/04/2009, 14:21
Avatar de DBMark  
Fecha de Ingreso: mayo-2008
Ubicación: Oxford
Mensajes: 35
Antigüedad: 16 años
Puntos: 6
Respuesta: Proceso automático para insertar 50000 registros en una base de datos MySQ

Estupendo! Si funciona bien es un truco muy util, aunque no es practico para todas las tablas, Saludos.
  #11 (permalink)  
Antiguo 16/04/2009, 14:24
 
Fecha de Ingreso: octubre-2008
Mensajes: 276
Antigüedad: 15 años, 6 meses
Puntos: 1
Respuesta: Proceso automático para insertar 50000 registros en una base de datos MySQ

Aun sigue y han pasado ya 11 minutos.
__________________
Uso Apache 2.2 con PHP 5.5.9 y MySQL 5.1
Uso Eclipse IDE for Java Developers, Version: Mars.1 Release (4.5.1), Build id: 20150924-1200 para programar en Java bajo Windows
  #12 (permalink)  
Antiguo 16/04/2009, 14:41
Avatar de DBMark  
Fecha de Ingreso: mayo-2008
Ubicación: Oxford
Mensajes: 35
Antigüedad: 16 años
Puntos: 6
Respuesta: Proceso automático para insertar 50000 registros en una base de datos MySQ

Hay otra manera de hacer la consulta mas rapido, pero no se si funciona con MYISAM (es un truco de INNODB)

-- antes de importar

SET unique_checks=0;

-- despues de importar

SET unique_checks=1

La verdad es que nunca he usado esto. :(
  #13 (permalink)  
Antiguo 16/04/2009, 14:54
Avatar de DBMark  
Fecha de Ingreso: mayo-2008
Ubicación: Oxford
Mensajes: 35
Antigüedad: 16 años
Puntos: 6
Respuesta: Proceso automático para insertar 50000 registros en una base de datos MySQ

Usa el comando

show variables;

ver el tamano de key_buffer_size
tal vez sea demasiado pequeno para una unsertacion de muchos registros.

Mas aqui:

dev.mysql.com/doc/refman/5.0/es/server-parameters.html
  #14 (permalink)  
Antiguo 16/04/2009, 15:07
 
Fecha de Ingreso: octubre-2008
Mensajes: 276
Antigüedad: 15 años, 6 meses
Puntos: 1
Respuesta: Proceso automático para insertar 50000 registros en una base de datos MySQ

Pues todavía sigue y ya han pasado 43 minutos.
__________________
Uso Apache 2.2 con PHP 5.5.9 y MySQL 5.1
Uso Eclipse IDE for Java Developers, Version: Mars.1 Release (4.5.1), Build id: 20150924-1200 para programar en Java bajo Windows
  #15 (permalink)  
Antiguo 16/04/2009, 15:24
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Proceso automático para insertar 50000 registros en una base de datos MySQ

Cita:
Iniciado por letni Ver Mensaje
Pero el método de las inserciones múltiples requiere que meta a mano los valores que van a tomar los campos, si tengo que hacer eso con un millón de registros sí que me eternizo más que con lo otro.

La gracia está en que se generen sólos los campos de los registros para que sea un proceso automático.

No se si me explico.

Saludos.
Vuelvo a mi propuesta.
En realidad, si lo programas adecuadamente, no es necesario ni siquiera "meter a mano los valores", sino programar un método tal que tome una taba dinámicamente, cuyos campos por nombre, tipo y orden coincidan con los campos a insertar, y cuyo nombre de tabla coincida con la tabla a actualizar y dejar que ese método se encarque de construir la sentencia con todos sus detalles y ejecutarla.
Yo eso lo tengo programado en VB.Net y funciona hasta con tablas de 14.000.000 de registros (tengo un método de toma de datos remotos entre diferente PCs que hace la tarea en forma masiva), que es el límite de mis prueba.
Puedo pasartelo para que lo veas cómo es la cosa.
Cita:
si tengo que hacer eso con un millón de registros sí que me eternizo más que con lo otro.
Ni tan así. El volcado de una tabla con 246.000 registros a un archivo .csv, con las conversiones incluidas, solamente lleva algunos segundos.
Uno de los procesos que tuvimos que preparar en una aplciación, vuelva toda una tabla de hasta 600.000 registros a un archivo plano y los levanta en una tabla de MySQL en unmáximo de 48 segundos, según cronometramos. Y eso con una PC P4 de 2.6 GHz y disco de 80 Gb... algo en este momento bastante básico.
El proceso completo de generación de reporte para la prestación de servicios de conductores de una empresa con 20 conductores, vehiculos y 30 días de servicio duró 4.37 minutos. Incluyendo consolidación de datos y volcado a disco.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 16/04/2009 a las 15:31
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Tema Cerrado

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 19:34.