Foros del Web » Programando para Internet » PHP »

performance de insert en PHP-MySQL

Estas en el tema de performance de insert en PHP-MySQL en el foro de PHP en Foros del Web. Tenia una consulta para hacerles: Tengo que migrar una base en dbf a MySQL con PHP. La cantidad de registros es muy grande: 350.000. La ...
  #1 (permalink)  
Antiguo 10/02/2004, 11:05
 
Fecha de Ingreso: febrero-2004
Ubicación: Bs. As. - Argentina
Mensajes: 53
Antigüedad: 13 años, 10 meses
Puntos: 0
performance de insert en PHP-MySQL

Tenia una consulta para hacerles:
Tengo que migrar una base en dbf a MySQL con PHP. La cantidad de registros es muy grande: 350.000.
La pregunta es: que es mas rapido, hacer un insert por registro a pasar o en un insert poner varios registros?

Ejemplo:
INSERT INTO table VALUES (val1,val2);

o

INSERT INTO table VALUES (val1,val2), (val3,val4), ... , (valx,valy);
__________________
Saludos!
  #2 (permalink)  
Antiguo 10/02/2004, 13:38
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
El SQL de Msyql .. para un insert sólo soporta la creación de un resgistro por INSERT .. lo mismo sucede con la ejecución de ese SQL vía PHP con mysql_query() .. sólo ejecuta una instrucción SQL (hasta el primer ; que pudieras tener) por llamada de la función.

mas info:
http://www.mysql.com/doc/en/INSERT.html
www.php.net/mysql

Ahora .. si tienes un archivo "SQL" con esas instrucciones separadas por ; (cada INSERT .. tipico de un "backup" hecho desde phpMyadmin o gestores de Mysql similares) .. puedes usar el comando de mysql "LOAD DATA ...". Eso será más optimo en cuanto a "performance" que usar PHP y mysql_query() en un bucle (bucle que leeiría una instrucción de tu archivo (hasta el ;) para ejecutar instrucción por instrucción SQL.)

mas info:
http://www.mysql.com/doc/en/LOAD_DATA.html

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #3 (permalink)  
Antiguo 10/02/2004, 15:16
 
Fecha de Ingreso: febrero-2004
Ubicación: Bs. As. - Argentina
Mensajes: 53
Antigüedad: 13 años, 10 meses
Puntos: 0
Cluster:
Cuando hable de poner mas de un registro, no me referia a un batch, sino que en la misma sentencia SQL del insert poner varios registros separados por coma. Fijate en el segundo ejemplo como pongo varios registros separados por coma en la misma sentencia (el registro (val1,val2), el (val3,val4), etc). Entonces, si tengo que insertar 100 registros:
es mas rapido ejecutar 100 inserts o uno con los 100 registros separados por coma?
__________________
Saludos!
  #4 (permalink)  
Antiguo 10/02/2004, 15:31
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Ok, (creia que pretendias hacer un "batch").

En ese caso .. piensa que si vas a tener que generar ese "mega" string de forma dinámica .. Vas a perder ahí mucho tiempo de proceso (en este caso de PHP) .. Tal vez la consulta de INSERT sea más rápida ya que entregaría todo el "INSERT" a Msyql y este se lo trabajaría ..

Lo que si que veo es que de una forma u otra .. vas a tener que usar algún bucle . ya sea para lanzar "350.000" veces un mysql_query() con un Sólo registro de INSERT .. o para generar ese "mega" string (cadena) (¿soportará tanto PHP de un tirón? .. tal vez llegues al topo por defecto de memoria que consume un script PHP (8MBytes) si no lo modificas) para componer tu mysql_query() único.

Si usas la opción clásica (un INSERT por registro lanzado por un mysql_query() .. ) puedes controlar los errores que pudieras tener en el proceso (mysql_query(....) or die (mysql_error()) ... ) y si falla el proceso .. por lo menos podrías retomarlo en ese punto. Si usas ese "mega" y único INSERT .. supongo (no te lo puedo confirmar) que si falla algo .. te mandará el error y no hará nada del proceso..

Podrías hacer tus pruebas con X registros usando un método u otro y ásí sales de dudas (por mi parte no he hecho pruebas así).

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.

Última edición por Cluster; 10/02/2004 a las 15:33
  #5 (permalink)  
Antiguo 10/02/2004, 15:47
 
Fecha de Ingreso: febrero-2004
Ubicación: Bs. As. - Argentina
Mensajes: 53
Antigüedad: 13 años, 10 meses
Puntos: 0
Inicialmente habia hecho que mandara todo en un INSERT. Y efectivamente como vos decis, no soportó armar el string con los 350.000 registros cada uno con 35 columnas. Luego, hice la del uno por uno. Ahora queria llegar a una solucion no tan extrema, tipo de 100 registros por insert para ganar performance.
El tema de los errores lo pienso manejar con transacciones.

En fin, no me queda otra que testearlo.
De todos modos gracias.
__________________
Saludos!
  #6 (permalink)  
Antiguo 12/02/2004, 13:23
 
Fecha de Ingreso: febrero-2004
Ubicación: Bs. As. - Argentina
Mensajes: 53
Antigüedad: 13 años, 10 meses
Puntos: 0
Bueno:
Lo probe y la conclusion es que es mas rapido insertar de a muchos por vez que uno por uno.
__________________
Saludos!
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 22:21.