Foros del Web » Programando para Internet » PHP »

insertar miles de registros en menos tiempo

Estas en el tema de insertar miles de registros en menos tiempo en el foro de PHP en Foros del Web. Hola Amigos!!! necesito insertar miles de registros en el menor tiempo posible lo estoy haciendo de esta forma @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código MySQL: Ver original INSERT ...
  #1 (permalink)  
Antiguo 19/12/2012, 03:59
 
Fecha de Ingreso: octubre-2010
Ubicación: Buenos Aires
Mensajes: 557
Antigüedad: 13 años, 7 meses
Puntos: 4
insertar miles de registros en menos tiempo

Hola Amigos!!!
necesito insertar miles de registros en el menor tiempo posible
lo estoy haciendo de esta forma
Código MySQL:
Ver original
  1. INSERT into tabla (id, nombre,tel) values(null,jose,4587),(null,pepe,4557),(null,mario,4566)
con esta consulta para insertar 25000 registros esta tardando 90 segundos y creo que es mucho tiempo y en algo me estoy equivocando
tambien quise probar con INSERT DELAYED pero en la documentacion de mysql decia que no soporta tablas innodb y tampoco replicacion,
en fin de acuerdo a su experiencia
como podria lograr insertar como minimo 25000 registros en un pestañeo
(estoy usando PHP)
saludos y muchas gracias!
  #2 (permalink)  
Antiguo 19/12/2012, 04:19
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: insertar miles de registros en menos tiempo

Código MySQL:
Ver original
  1. INSERT INTO tabla (nombre,tel) VALUES('jose',4587),('pepe',4557),('mario',4566)...

id y los NULL no son necesarios ya que id es autoincremental, pero no se si eso mejorara mucho la velocidad.

Los delimitadores ' ' en los campos de texto son necesarios en una sintaxis correcta....
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.

Última edición por quimfv; 19/12/2012 a las 04:26
  #3 (permalink)  
Antiguo 19/12/2012, 04:22
Avatar de Malenko
Moderador
 
Fecha de Ingreso: enero-2008
Mensajes: 5.323
Antigüedad: 16 años, 3 meses
Puntos: 606
Respuesta: insertar miles de registros en menos tiempo

Haces el insert de los 25.000 en un unico insert? o lo haces en paquetes pequeños?

La consulta está perfecta (aunque no entiendo el id a null). Lo único que podría retrasar a ese insert es el tema de triggers o si tiene muchos indíces esa tabla por los tendría que ir reconstruyendo.
__________________
Aviso: No se resuelven dudas por MP!
  #4 (permalink)  
Antiguo 19/12/2012, 04:23
 
Fecha de Ingreso: octubre-2010
Ubicación: Buenos Aires
Mensajes: 557
Antigüedad: 13 años, 7 meses
Puntos: 4
Respuesta: insertar miles de registros en menos tiempo

Hola quimfv gracias por responder ,
si , ya habia probado
recien cambie el motor de la tabla a mysam y tarda exactamente lo mismo en ingresar 25000 registros (90 segundos)
  #5 (permalink)  
Antiguo 19/12/2012, 04:26
 
Fecha de Ingreso: octubre-2010
Ubicación: Buenos Aires
Mensajes: 557
Antigüedad: 13 años, 7 meses
Puntos: 4
Respuesta: insertar miles de registros en menos tiempo

hola Malenko gracias por responder
la consulta fue un ejemplo; En realidad la tabla tiene 23 campos y 9 indices
  #6 (permalink)  
Antiguo 19/12/2012, 04:34
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: insertar miles de registros en menos tiempo

Haz un INSERT de 500 registros en una sola inserción. Yo he llegado a hacer algunos de más, pero no te lo aconsejo.

Posiblemente deberás aumentar el size del buffer de datos (creo que es la variable key_buffer_size, pero habría que mirar bien el manual).

Otra posibilidad es usar LOAD DATA sobre un archivo plano (de charset utf8), que puede mejorar bastante el rendimiento del INSERT.

Si la fuente de datos es una consulta, incluso, es mejor usar INSERT... SELECT sobre la subconsulta que origina los datos.

Otra cosa a considerar es que tantos índices que mencionas conspiran contra la performance del INSERT. ¿Estás seguro de necesitar esos 9 indices?

En definitva, hay varias formas de enfrentar el problema. Para ubicar mejor el problema sería bueno que nos digas cuál es el origen de los datos a insertar.
__________________
¿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 19/12/2012, 04:34
Avatar de Malenko
Moderador
 
Fecha de Ingreso: enero-2008
Mensajes: 5.323
Antigüedad: 16 años, 3 meses
Puntos: 606
Respuesta: insertar miles de registros en menos tiempo

Cita:
Iniciado por tumbero_x Ver Mensaje
hola Malenko gracias por responder
la consulta fue un ejemplo; En realidad la tabla tiene 23 campos y 9 indices
Pues ya te digo que el problema son los índices. Cuantos son clustered y cuantos nonclustered? Has mirado si hay alguno que no se use (mirando estadísticas de uso) o si se pueden agrupar?
__________________
Aviso: No se resuelven dudas por MP!
  #8 (permalink)  
Antiguo 19/12/2012, 04:46
 
Fecha de Ingreso: octubre-2010
Ubicación: Buenos Aires
Mensajes: 557
Antigüedad: 13 años, 7 meses
Puntos: 4
Respuesta: insertar miles de registros en menos tiempo

hola gnzsoloyo
deje un solo index y sigue tardando 90 segundos
buscando en google alguien, subio a 512m innodb_buffer_pool_size que por defecto esta en 17m y seguia tardando 90 segundos
la variable key_buffer_size la subi a 512 y sin resultados favorables
la fuente viene de un formulario en php
gracias amigos por ayudarme
  #9 (permalink)  
Antiguo 19/12/2012, 05:31
Avatar de Malenko
Moderador
 
Fecha de Ingreso: enero-2008
Mensajes: 5.323
Antigüedad: 16 años, 3 meses
Puntos: 606
Respuesta: insertar miles de registros en menos tiempo

Cita:
Iniciado por tumbero_x Ver Mensaje
hola gnzsoloyo
deje un solo index y sigue tardando 90 segundos
buscando en google alguien, subio a 512m innodb_buffer_pool_size que por defecto esta en 17m y seguia tardando 90 segundos
la variable key_buffer_size la subi a 512 y sin resultados favorables
la fuente viene de un formulario en php
gracias amigos por ayudarme
Te vuelvo a hacer la pregunta :P

El indice que has dejado es clustered o nonclustered?
__________________
Aviso: No se resuelven dudas por MP!
  #10 (permalink)  
Antiguo 19/12/2012, 06:07
 
Fecha de Ingreso: octubre-2010
Ubicación: Buenos Aires
Mensajes: 557
Antigüedad: 13 años, 7 meses
Puntos: 4
Respuesta: insertar miles de registros en menos tiempo

Hola Malenko recien llego
la verdad no tengo idea de como fijarme eso para responderte
como podria hacerlo?
  #11 (permalink)  
Antiguo 19/12/2012, 07:10
Avatar de Malenko
Moderador
 
Fecha de Ingreso: enero-2008
Mensajes: 5.323
Antigüedad: 16 años, 3 meses
Puntos: 606
Respuesta: insertar miles de registros en menos tiempo

Cita:
Iniciado por tumbero_x Ver Mensaje
Hola Malenko recien llego
la verdad no tengo idea de como fijarme eso para responderte
como podria hacerlo?
Yo es que a ese nivel me manejo más con SQL Server. CREO que en mysql el tipo de los indices depende del motor (engine).

De todas formas, el funcionamiento de clustered o nonclustered es algo "general" es el mismo en un indice de mysql o de sql server. Cuando el indice es clustered hay que reorganizar todo el índice porque se inserta de forma ordenada. Si el indice es clustered y el campo no es incremental hay que hacer espacio en disco, mover el indice e insertar en el "hueco" que toca para que esté el indice reordenado. En cambio en un indice nonclustered un insert con un valor no consecutivo no conlleva al realojo y la reconstrucción física del índice. Por eso es mejor dejar los indices clustered para campos identidad y los nonclustered para el resto.
__________________
Aviso: No se resuelven dudas por MP!
  #12 (permalink)  
Antiguo 19/12/2012, 07:15
 
Fecha de Ingreso: octubre-2010
Ubicación: Buenos Aires
Mensajes: 557
Antigüedad: 13 años, 7 meses
Puntos: 4
Respuesta: insertar miles de registros en menos tiempo

ok gracias!!!
pero lo que voy a hacer es separar ese trozo de codigo php que hace los insert y despues ejecutarlo en segundo plano
voy a seguir probando
muchas gracias atodos por su tiempo y dedicacion
Saludos!!!
  #13 (permalink)  
Antiguo 19/12/2012, 09:42
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: insertar miles de registros en menos tiempo

¿Estás seguro de que el cuello de botella no es la red o el hardware donde está el Server de MySQL?
Es una opción que muchos se olvidan de considerar...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #14 (permalink)  
Antiguo 19/12/2012, 09:55
 
Fecha de Ingreso: septiembre-2012
Ubicación: Madrid
Mensajes: 89
Antigüedad: 11 años, 7 meses
Puntos: 1
Respuesta: insertar miles de registros en menos tiempo

Te digo una solución que no tiene que ver con el lenguaje.
Usar el framework PDO para manejar consultas a bases de datos aumenta la velocidad de estas.
  #15 (permalink)  
Antiguo 19/12/2012, 10:59
 
Fecha de Ingreso: octubre-2010
Ubicación: Buenos Aires
Mensajes: 557
Antigüedad: 13 años, 7 meses
Puntos: 4
Respuesta: insertar miles de registros en menos tiempo

hola gnzsoloyo estoy trabajando en un servidor de pruebas
lo que estoy tratando de lograr es crear un archivo txt con las 25000 filas
y cuando termine de crearlos , levantarlos con LOAD DATA INFILE
pero estoy trabadisimo
porque el archivo lo genero pero no lo puedo levantar
pongo el codigo por si alguien me quiere dar una mano
Código PHP:
Ver original
  1. for($x=1;$x<$25000;$x++)
  2.         {
  3.         $sql.='null,'.$id.',0,0,0,'.$arti_id[$i].',"",(SELECT gar_art FROM articulos WHERE arti_id='.$arti_id[$i].'),"0",now(),now(),"Aj","'.Empresa::em().'",0,0,0,0,0,0,"0",0,0,"0"\n'
  4. };
  5. $seriales=fopen('seriales/Aj'.$id.'.txt','w');
  6.     fwrite($seriales,$sql);
  7.     fclose($seriales) ;
  8.     mysql_query('LOAD DATA INFILE "seriales/Aj'.$id.'.txt" INTO TABLE seriales',Conectar::con())or die(mysql_error());
Hola Kies89 voy a tener en cuenta el PDO
gracias

Etiquetas: mysql
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.
Respuesta




La zona horaria es GMT -6. Ahora son las 20:49.