Foros del Web » Programando para Internet » PHP »

Ejecutar muchas instrucciones mysql Update seguidas

Estas en el tema de Ejecutar muchas instrucciones mysql Update seguidas en el foro de PHP en Foros del Web. Buenos días Tenemos un script php con un bucle que inenta ejecutar una serie -miles- de instrucciones UPDATE sencillas a una base de datos mysql ...
  #1 (permalink)  
Antiguo 19/09/2016, 04:09
Avatar de jm00092  
Fecha de Ingreso: mayo-2005
Ubicación: Ronda
Mensajes: 106
Antigüedad: 18 años, 11 meses
Puntos: 0
Información Ejecutar muchas instrucciones mysql Update seguidas

Buenos días

Tenemos un script php con un bucle que inenta ejecutar una serie -miles- de instrucciones UPDATE sencillas a una base de datos mysql

Pero el programa siempre se satura. Al principio va rapido pero en seguida se pone muy lento y a veces no termina

¿Como hacer que las instrucciones sql entren secuencialmente, una cuando termine la anterior? ¿Alguna otra forma de hacerlo para evitar este atasco?

Gracias
  #2 (permalink)  
Antiguo 19/09/2016, 06:11
 
Fecha de Ingreso: octubre-2010
Ubicación: España
Mensajes: 1.007
Antigüedad: 13 años, 6 meses
Puntos: 123
Respuesta: Ejecutar muchas instrucciones mysql Update seguidas

Podéis probar utilizando sentencias preparadas e incrementar el tiempo máximo de ejecución del script (max_execution_time ), si es necesario pausar un el Script entre consulta y consulta ( usleep ).

Lo que no terminó de entender el motivo o la necesidad de tener que actualizar miles de registros uno a uno de forma asidua ¿ por qué surge esta necesidad ? Por que en muchos casos esto se da por un mal planteamiento.
__________________
Unset($vida['malRollo']);
  #3 (permalink)  
Antiguo 22/09/2016, 01:19
Avatar de jm00092  
Fecha de Ingreso: mayo-2005
Ubicación: Ronda
Mensajes: 106
Antigüedad: 18 años, 11 meses
Puntos: 0
Respuesta: Ejecutar muchas instrucciones mysql Update seguidas

La situación es que hay un archivo de texto con los precios y hay que actualizar la base de datos fila por fila para ponerle el nuevo precio a cada uno. Ni están en el mismo orden ni hay todos los artículos.

¿Cómo sería otra mejor forma de hacerlo? . Gracias
  #4 (permalink)  
Antiguo 22/09/2016, 01:29
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Ejecutar muchas instrucciones mysql Update seguidas

¿Ejecutas dicho procedimiento desde tu servidor web?

Ese es el problema, creo que deberías usar CRONjobs.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #5 (permalink)  
Antiguo 22/09/2016, 04:04
 
Fecha de Ingreso: octubre-2010
Ubicación: España
Mensajes: 1.007
Antigüedad: 13 años, 6 meses
Puntos: 123
Respuesta: Ejecutar muchas instrucciones mysql Update seguidas

Es muy difícil determinar la mejor forma sin conocer la aplicación, sus requerimientos y como está programada.

Yo intentaría determinar primero la causa des problema, saber si es por que excede el tiempo de ejecución, si excede la memoria disponible para el Script, si es por que se crean cientos de conexiones a mysql y este las rechaza por concurrencia, si es un problema de los datos... en definitiva determinar claramente la causa del problema para poder atacarlo directamente.

Por otro lado, el archivo de texto de donde tomas los datos, ¿ es generado por la propia aplicación, una aplicación externa, a mano? ¿ es posible hacer la actualización de los datos desde otro fuente que no sea el archivo de texto?

Igualmente como comenta el compañero estos casos de volcado masivo de datos, se suelen automatizar mediante un Cron Job para realizar lo de forma automática en hora de poca carga.
__________________
Unset($vida['malRollo']);
  #6 (permalink)  
Antiguo 22/09/2016, 05:40
Avatar de jm00092  
Fecha de Ingreso: mayo-2005
Ubicación: Ronda
Mensajes: 106
Antigüedad: 18 años, 11 meses
Puntos: 0
Respuesta: Ejecutar muchas instrucciones mysql Update seguidas

El archivo de texto lo genera otro programa en otro servidor externo y se copia al propio servidor cuando está completo

El script php se ejecuta en el mismo servidor donde está la base de datos mysql

Los límites de memoria, tiempo de ejecución, etc están muy apliados

La tarea está automatizada, se hace por las noches


Mi duda es si es recomendable hacer tantas consultas SQL seguidas, o hay otra forma mejor de hacerlo. Gracias
  #7 (permalink)  
Antiguo 22/09/2016, 08:27
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Ejecutar muchas instrucciones mysql Update seguidas

Cita:
Mi duda es si es recomendable hacer tantas consultas SQL seguidas, o hay otra forma mejor de hacerlo. Gracias
No creo que sea problema, porque precisamente para esos han sido diseñadas las bases de datos: si no, imagina el terror de hacer tantas consultas.

Tu "error" radica en cómo ejecutas PHP para realizar dichas consultas ¿es necesario?

Es decir, ¿no podrías sencillamente ejecutar dicho SQL directamente?

¿Por qué es necesario hacerlo a través de PHP?

Si eso último es inevitable, deberías considerar el mandar dicho proceso fuera del contexto web: porque eso, en definitiva, es una pésima práctica.

Las limitaciones, o bien, la configuración de límite de ejecución (sobre todo) aplica únicamente para contexto CGI, pero si usas el contexto CLI éstas limitantes desaparecen.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #8 (permalink)  
Antiguo 22/09/2016, 09:24
alvaro_trewhela
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Ejecutar muchas instrucciones mysql Update seguidas

y si aplica sleep?
  #9 (permalink)  
Antiguo 22/09/2016, 09:36
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Ejecutar muchas instrucciones mysql Update seguidas

Cita:
Iniciado por alvaro_trewhela Ver Mensaje
y si aplica sleep?
Peor.

La función sleep() detiene el proceso por cierto tiempo, no lo mejora, no lo optimiza: simplemente lo bloquea.

¿Qué beneficios tiene? Ninguno.

Si tienes un límite de ejecución de 120 segundos, y aplicas sleep() simplemente consumirías el tiempo que tienes disponible.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #10 (permalink)  
Antiguo 22/09/2016, 11:24
 
Fecha de Ingreso: octubre-2010
Ubicación: España
Mensajes: 1.007
Antigüedad: 13 años, 6 meses
Puntos: 123
Respuesta: Ejecutar muchas instrucciones mysql Update seguidas

Hay muchas formas de hacer esto, ¿cual es la apropiada? pues depende.

Lo que no terminó de entender es si has podido determinar la causa de forma concreta, ¿ que error genera cuando falla el Script ? intensa darnos datos más específicos acerca del problema, ya que 'se satura' no aporta mucho.

También puedes intentar determinar si falla a partir de x consultas, o después de x tiempo de ejecución.

Por otro lado creo recordar aún que no estoy seguro que mysql tenía límites en cuanto a número de consultas por hora o conexión, que algunos hosting tener establecidos.

Edit
A esto me referia
__________________
Unset($vida['malRollo']);
  #11 (permalink)  
Antiguo 23/09/2016, 04:25
Avatar de jm00092  
Fecha de Ingreso: mayo-2005
Ubicación: Ronda
Mensajes: 106
Antigüedad: 18 años, 11 meses
Puntos: 0
Respuesta: Ejecutar muchas instrucciones mysql Update seguidas

Gracias por vuestra respuesta

Algunos detalles...

Lo hago con PHP porque hay que hacer varias operaciones con el archivo de entrada como convertir algunos campos. También generar un registro de lo que se ha cambiado, etc

El proceso es en varias partes

-Inicio. Comprobaciones iniciales. Carga del archivo
-Lectura del archivo línea por línea
---Dentro de este bucle va la instrucción SQL que se repite mucho
-Final. Actualización de totales con otras instrucciones SQL sencillas
-Presentación del resultado

El servidor lo tenemos con limites muy ampliados y casi nunca da error de tiempo de espera agotado. A veces tarda incluso hora y media (!!)

Lo que falla es que muchas veces se sale del bucle de lectura línea por línea antes de terminar de leer el archivo. Pero el programa termina bien porque se calculan los totales y se da el resultado. Todo correcto. No se interrumpió con error. Pero el proceso de actualización está incompleto.

Ya probé lo de sleep (1) cada 100 registros, pero no se notó ninguna mejora.
  #12 (permalink)  
Antiguo 23/09/2016, 06:34
 
Fecha de Ingreso: octubre-2010
Ubicación: España
Mensajes: 1.007
Antigüedad: 13 años, 6 meses
Puntos: 123
Respuesta: Ejecutar muchas instrucciones mysql Update seguidas

Cita:
Lo que falla es que muchas veces se sale del bucle de lectura línea por línea antes de terminar de leer el archivo. Pero el programa termina bien porque se calculan los totales y se da el resultado. Todo correcto. No se interrumpió con error. Pero el proceso de actualización está incompleto.
Si esto es así, tu problemas no es que 'salga del bucle', php solo saldría del bucle si en cuenta una sentencia break o si se cumple la condición para finalizar. O también podría saltar un ciclo si en cuenta una sentencia continue.
Mientras no se de ninguno de estos casos va a ejecutar todos los ciclos.

Es posible que lo que está fallando sean las sentencias sql dentro del bucle. ¿ hacéis alguna comprobación para saber si la sentencia sql se ejecutó correctamente ? Puedes utilizar mysql error para comprobar si la última sentencia tuvo algún error.

Un ejemplo sencillo, del manual:

Código PHP:
if (!mysqli_query($link"SET a=1")) {
    
printf("Errormessage: %s\n"mysqli_error($link));

__________________
Unset($vida['malRollo']);
  #13 (permalink)  
Antiguo 24/09/2016, 09:09
 
Fecha de Ingreso: enero-2002
Mensajes: 1.174
Antigüedad: 22 años, 3 meses
Puntos: 21
Respuesta: Ejecutar muchas instrucciones mysql Update seguidas

Yo tengo aplicaciones con ese tipo de procesos. Se hace cuando la información se encuentra en un sistema y se desea incorporar a otro. Métodos hay varios y depende de cada caso. Por ejemplo me preguntaría: ¿Cuantos renglones son? ¿De que longitud? la BD receptora ¿cuantos registros tiene almacenados? ¿Cual es la configuración de la BD?

En base a las mínimas respuestas anteriores se va estructurando un plan el cual debe ser a prueba y error, pero claro que tiene solución.

En mi caso tengo sistemas web que se alimentan de sistemas anteriores, y en tanto finalizo los nuevos es necesario hacer este tipo de operaciones. Mis procesos se ejecutan a diario varias veces al dí y por la noche otros de mayor volumen.

¿El servidor es local o en la nube? ¿Cuales son sus recursos instalados?
Ufff. son varias cosas.

Suerte!!!
  #14 (permalink)  
Antiguo 24/09/2016, 13:33
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: Ejecutar muchas instrucciones mysql Update seguidas

Cómo ejecutas esas instrucciones?, si vemos tu código tal vez podemos sugerir algo.
__________________
- León, Guanajuato
- GV-Foto
  #15 (permalink)  
Antiguo 24/09/2016, 21:29
 
Fecha de Ingreso: agosto-2012
Ubicación: M.
Mensajes: 2.031
Antigüedad: 11 años, 8 meses
Puntos: 52
Respuesta: Ejecutar muchas instrucciones mysql Update seguidas

Y si lo haces mejor asi?

-Inicio. Comprobaciones iniciales. Carga del archivo
-Lectura del archivo línea por línea
---sql1[posicion]= Dentro de este bucle va la instrucción SQL que se repite mucho
--Ejecutas las consultas guardadas en el arreglo una vez terminado el bucle anterior.
-Final. Y Actualizas todos los totales con una sola consulta sql donde sus filtros abarquen todo lo que se deba actualizar.


-Presentación del resultado
__________________
a veces creemos que es algo básico pero al profundizar nos damos cuenta que estábamos tocando solo la cola de la culebra

Etiquetas: bucle, mysql, secuencia, update
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 02:26.