Discussion:
Lentitud al realizar consultas MySQL
(too old to reply)
Carlos Do Carmo
2008-11-05 19:15:35 UTC
Permalink
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
</head>
<body bgcolor="#ffffff" text="#000000">
<font face="Courier New">Buenas Tardes.<br>
<br>
Estoy desarrollando un sistema con Python y wx, uso MySQLdb para
acceder a la base de datos. <br>
Resulta que&nbsp; instale el sistema en el equipo del cliente este pose un
servidor donde se encuentra la base de datos MySQL, al realizar alguna
consulta o alg&uacute;n insert se vuelve lenta la respuesta, el problema es
que al realizar la consulta hago esto<br>
<br>
&nbsp;&nbsp;&nbsp; db=MySQLdb.connect(host= xHost,user=xUser, passwd= xPasswd, db=xdb,
cursorclass=MySQLdb.cursors.DictCursor)<br>
&nbsp;&nbsp;&nbsp; c=db.cursor()<br>
&nbsp;&nbsp;&nbsp; c.execute("SELECT * FROM Acreedores")<br>
&nbsp;&nbsp;&nbsp; return c.fetchall()<br>
<br>
Lo que vuelve lento es el connect, prob&eacute; hacer el connect al iniciar el
sistema, pero si se realiza alguna modificaci&oacute;n desde otro equipo no se
actualiza, se debe salir y volver a entrar para ver el cambio realizado
por otro.<br>
<br>
<br>
Mi consulta es,<br>
&nbsp;&nbsp;&nbsp; Esta bien lo que estoy haciendo, realizar el connect cada ves que
realizo una consulta a la db.<br>
&nbsp;&nbsp;&nbsp; <br>
Si tengo la db en el equipo local funciona bien, o sea no queda lento,
para trabajar con una db en otro equipo hay que hacer algo mas o de
otro forma.<br>
<br>
Desde ya Gracias.<br>
<br>
Saludos.<br>
Carlos Do Carmo.<br>
<br>
<br>
<br>
</font>
</body>
</html>
Martin Alonso
2008-11-05 18:21:05 UTC
Permalink
Hola,

Mira, en mi opinion, no me parece correcto que estes conectandote cada vez
que vas a tirar una consulta a la base. Yo trataria de efectuar la conexion
una sola vez y mantenerla a lo largo de la ejecucion del programa. Ya que me
imagino que no debes de tener un problema de licencias(cantidad limitada de
accesos concurrentes) para acceder a la Base de datos. O me equivoco?

Martin Ignacio Alonso
Carlos Do Carmo
2008-11-05 19:28:43 UTC
Permalink
Post by Martin Alonso
Hola,
Mira, en mi opinion, no me parece correcto que estes conectandote cada
vez que vas a tirar una consulta a la base. Yo trataria de efectuar la
conexion una sola vez y mantenerla a lo largo de la ejecucion del
programa. Ya que me imagino que no debes de tener un problema de
licencias(cantidad limitada de accesos concurrentes) para acceder a la
Base de datos. O me equivoco?
Martin Ignacio Alonso
Tienes razón, no es correcto hacerlo de esta forma, y no tengo problemas
de licencias, antes de hacer de esta forma realizaba la conexión al
iniciar el sistema, como lo usaba yo para realizar pruebas no tenia
problemas pero al llevarlo a la empresa del cliente donde tiene varias
maquinas me di cuenta que cuando un usuario realizaba alguna
modificación otro usuario no la veía hasta salir y volver a entrar al
sistema.
por eso probé hacerlo de esta forma
Martin Alonso
2008-11-05 18:36:10 UTC
Permalink
Carlos,

Pregunta tonta, haces un commit cuando terminas de aplicar algun cambio?
Porque el ejemplo que pusiste es para obtener registros, no
insertar/actualizar/eliminar, y estas mencionando que otros usuarios no ven
los cambios hasta que vos no cerras la conexion.
Te planteo una duda porque yo no trabaje con mysql con python. No tendras
que hacer un commit luego de efectuar la modificacion a alguna tabla? Capaz
cuando se cierra la conexion, se efectuan los commit. Fijate la
documentacion de mysql y la de python. Yo cuando laburaba con python y
sqlite3, tenia que hacer un commit luego de ejecutar cada cursor.

Martin Ignacio Alonso
Carlos Do Carmo
2008-11-05 19:55:38 UTC
Permalink
Post by Martin Alonso
Carlos,
Pregunta tonta, haces un commit cuando terminas de aplicar algun
cambio? Porque el ejemplo que pusiste es para obtener registros, no
insertar/actualizar/eliminar, y estas mencionando que otros usuarios
no ven los cambios hasta que vos no cerras la conexion.
Te planteo una duda porque yo no trabaje con mysql con python. No
tendras que hacer un commit luego de efectuar la modificacion a alguna
tabla? Capaz cuando se cierra la conexion, se efectuan los commit.
Fijate la documentacion de mysql y la de python. Yo cuando laburaba
con python y sqlite3, tenia que hacer un commit luego de ejecutar cada
cursor.
Martin Ignacio Alonso
Martin.

Si realizo un commit cada vez que realizo un insert, update o
delete, el commit lo realizo al connect y también realizo un rollback,
en el caso que suceda algún error al memento de realizar algun cambio.
A parte del commit tengo que volver a conectar con la db antes de
ralizar alguna consulta, porque si no lo hago no me refleja los cambios
realizados por otros.
Martin Alonso
2008-11-05 19:29:26 UTC
Permalink
Carlos,

El commit lo realizas al connect? o te expresaste mal, o lo estas haciendo
mal. El commit tiene que hacerse cada vez que se efectua un cambio a la base
de datos, NO cuando te conectas a ella.

Todo bien, pero no me suena logico lo que me estas diciendo. Es probable que
como workarround te sirva a vos, pero, dudo mucho que el engine este
diseñado para que CADA VEZ que vos hagas una modificacion a la bd, tengas
que reconectarte a ella para que los cambios te visualizes. Me parece que
esto no es tanto problema de python sino de el engine que estas usando.
Capaz alguien que haya usado mysqldb te pueda dar una mano :(

Suerte!

Martin Ignacio Alonso
Carlos Do Carmo
2008-11-05 20:43:23 UTC
Permalink
Post by Martin Alonso
Carlos,
El commit lo realizas al connect? o te expresaste mal, o lo estas
haciendo mal. El commit tiene que hacerse cada vez que se efectua un
cambio a la base de datos, NO cuando te conectas a ella.
Todo bien, pero no me suena logico lo que me estas diciendo. Es
probable que como workarround te sirva a vos, pero, dudo mucho que el
engine este diseñado para que CADA VEZ que vos hagas una modificacion
a la bd, tengas que reconectarte a ella para que los cambios te
visualizes. Me parece que esto no es tanto problema de python sino de
el engine que estas usando. Capaz alguien que haya usado mysqldb te
pueda dar una mano :(
Suerte!
Martin Ignacio Alonso
Me exprese mal, si lo hago cuando realizo un cambio.

Gracias, por responder.

Voy a googlear un poco a ver que encuentro
Lucio Torre
2008-11-05 19:46:29 UTC
Permalink
Post by Carlos Do Carmo
Me exprese mal, si lo hago cuando realizo un cambio.
Gracias, por responder.
otra buena manera de encontrar el problema es que postees un ejemplo
minimo de codigo donde se pueda observar el issue. La gente te va a
poder ayudar mas y a vos te va a servir el ejercicio.

Lucio.
Carlos Do Carmo
2008-11-05 21:10:41 UTC
Permalink
Post by Lucio Torre
Post by Carlos Do Carmo
Me exprese mal, si lo hago cuando realizo un cambio.
Gracias, por responder.
otra buena manera de encontrar el problema es que postees un ejemplo
minimo de codigo donde se pueda observar el issue. La gente te va a
poder ayudar mas y a vos te va a servir el ejercicio.
Lucio.
---------------------------------------------------------------------
PyAr - Python Argentina - Sitio web: http://www.python.com.ar/
Lucio.

Acá va un cacho del código donde guardo datos en una tabla.



Estoy desarrollando con boa constructor.

Esto esta al iniciar el programa.

db = MySQLdb.connect(host="192.168.1.254", user="terminal",
passwd="11111", db="prueba", cursorclass=MySQLdb.cursors.DictCursor)
c = db.cursor()



Esto en un wx.Dialog(uso db y c en el ejemplo de abajo, pero en el
sistema uso unas variables globales)

try:

c.execute("START TRANSACTION")

sql = "INSERT INTO tipo_gasto (tipoG_Nom, tipoG_CtaCont)
Values (%s, %s) "
xDatos = (self.Nombre.GetValue(), xCta)

c.execute(sql, xDatos)

db.commit()

except Exception, e:
print e.__str__()
db.rollback()



Al hacer esto me graba en base de datos, sin salir del sistema me voy a
buscar los datos los veo, pero si otro usuario en otra maquina va a
buscar los datos no los ve hasta realizar alguna modificación en la base
de datos.

Para mostrar buscar los datos hago.


sql = "SELECT * FROM tipo_gasto "
c.execute(sql)
resultados = c.fetchall()

Probe hacer un commit antes de un select y ahi si veo los datos. hay
algo que queda colgado, ya que para que me refresque los datos que
ingreso otro usuario debo hacer un commit antes del select.

Le paso esto por si alguien ve algo que yo no.

Gracias, seguiré revisando.

Saludos
Ernesto Savoretti
2008-11-05 21:04:08 UTC
Permalink
Post by Carlos Do Carmo
c.execute("START TRANSACTION")
sql = "INSERT INTO tipo_gasto (tipoG_Nom, tipoG_CtaCont) Values
(%s, %s) "
xDatos = (self.Nombre.GetValue(), xCta)
c.execute(sql, xDatos)
db.commit()
print e.__str__()
db.rollback()
Acá estás mezclando conceptos, a saber:
Estás iniciando la transacción vía 'c.execute("START TRANSACTION"),
con lo cual deberías completarla con 'c.execute("commit")' o
'c.execute("rollback")' según corresponda.
Si en cambio, vas a usar el metodo commit del objecto connection
(db.commit() o db.rollback()), entonces no debés incluir
'c.execute("START TRANSACTION")', porque sino el db.commit() también
incluye esto, con lo cual estás generando un comportamiento indefinido
en el motor.
Espero que te sirva.

Ernesto Savoretti
Alejandro J. Cura
2008-11-05 22:26:01 UTC
Permalink
Post by Carlos Do Carmo
Post by Lucio Torre
otra buena manera de encontrar el problema es que postees un ejemplo
minimo de codigo donde se pueda observar el issue. La gente te va a
poder ayudar mas y a vos te va a servir el ejercicio.
Acá va un cacho del código donde guardo datos en una tabla.
Hola Carlos,

lo que lucio te sugiere no es un "cacho del código", sino que reduzcas
tu código en un ejemplo mínimo donde se presente este problema.
Esa es la manera clásica en donde podés darte cuenta si hay algo que
estás haciendo mal y de quien te ayuda en la lista pueda probar el
código y ver cual es el problema.
Si lo que pasas es sólo un "cacho del código", quien te ayuda tiene
que ponerse a darle forma usable a ese código, y poca gente tiene
*tantas* ganas de ayudar.

saludos,
--
alecu
Maximiliano Robaina
2008-11-05 19:51:28 UTC
Permalink
Post by Carlos Do Carmo
Buenas Tardes.
Estoy desarrollando un sistema con Python y wx, uso MySQLdb para
acceder a la base de datos.
Primero que nada no creo que sea un problema de python en si, así que
despues de leer el mail completo te diría que casí roza el OT :(. Pero
igualmente voy a ver si te puedo dar una mano.
Post by Carlos Do Carmo
Resulta que instale el sistema en el equipo del cliente este pose un
servidor donde se encuentra la base de datos MySQL, al realizar alguna
consulta o algún insert se vuelve lenta la respuesta, el problema es
que al realizar la consulta hago esto
db=MySQLdb.connect(host= xHost,user=xUser, passwd= xPasswd,
db=xdb, cursorclass=MySQLdb.cursors.DictCursor)
c=db.cursor()
c.execute("SELECT * FROM Acreedores")
return c.fetchall()
A ver...

SELECT * FROM Acreedores ????

Cuantos registos tiene la tabla Acreedores, o más aún, cuantos va a
tener en el futuro?
Pensa en esto: es necesario que el usuario de tu aplicación tenga todos
los acreedores a mano, quizás, para elegir uno? (acá esto que digo es
totalmente subjetivo porque no se cual es el objetivo concreto de tu
aplicación). Si tuvieses 100 registros en esta tabla, son 100 registros
más TODOS sus campos viajando por la red. Si no es necesario, es un
derroche de recursos al dope.

También habría que ver como es el diseño global de tu aplicación, muchas
cosas pueden afectar al rendimiento.
Podría haber un problema físico, como por ejemplo un problema de red,
por eso te anda lento en red y bien en forma local. Aunque
particularmente por el código que mostras de ejemplo me inclinaría más
por un problema de diseño.
Post by Carlos Do Carmo
Lo que vuelve lento es el connect, probé hacer el connect al iniciar
el sistema, pero si se realiza alguna modificación desde otro equipo
no se actualiza, se debe salir y volver a entrar para ver el cambio
realizado por otro.
Que tipo de engine (driver) estás usando con MySQL?
En el caso de que sea InnoDB, tene en cuanta que este es transaccional.
Para entender un poco mejor el porque digo esto, te invito a que
investiges (a lo mejor ya lo sabés) sobre niveles aislamiento de
transacciones y por sobre todo en como funcionan las transacciones.
Post by Carlos Do Carmo
Mi consulta es,
Esta bien lo que estoy haciendo, realizar el connect cada ves que
realizo una consulta a la db.
Si tengo la db en el equipo local funciona bien, o sea no queda lento,
para trabajar con una db en otro equipo hay que hacer algo mas o de
otro forma.
Bueno, esto que comentas tiene un poco que ver en lo que te decía más
arriba. No, no esta bien que hagas un connect cada vez que vas a hacer
una consulta. La conección a la DB consume recursos (y en algunos casos
bastante). Por lo tanto deberías tratar de hacer un solo connect, por
ejemplo, cuando inicia la aplicación.

Espero que esto te dé alguna idea. De todos modos son muchos factores
los que influyen en el rendimiento de una aplicación.
Cualquier cosa pregunta nomás.


Saludos.
Mariano Guerra
2008-11-05 21:55:16 UTC
Permalink
Post by Carlos Do Carmo
Buenas Tardes.
Estoy desarrollando un sistema con Python y wx, uso MySQLdb para acceder a
la base de datos.
Resulta que instale el sistema en el equipo del cliente este pose un
servidor donde se encuentra la base de datos MySQL, al realizar alguna
consulta o algún insert se vuelve lenta la respuesta, el problema es que al
realizar la consulta hago esto
db=MySQLdb.connect(host= xHost,user=xUser, passwd= xPasswd, db=xdb,
cursorclass=MySQLdb.cursors.DictCursor)
c=db.cursor()
c.execute("SELECT * FROM Acreedores")
return c.fetchall()
Lo que vuelve lento es el connect, probé hacer el connect al iniciar el
sistema, pero si se realiza alguna modificación desde otro equipo no se
actualiza, se debe salir y volver a entrar para ver el cambio realizado por
otro.
si lo que vuelve lento es el connect, te fijaste si no tenes problemas
de dns? cuanto demora hacer un

$ time host www.google.com
www.google.com is an alias for www.l.google.com.
www.l.google.com has address 209.85.195.104
www.l.google.com has address 209.85.195.99

real 0m0.647s
user 0m0.000s
sys 0m0.004s

obviamente cambia google por el host de la db :)

cuanto es el delay del ping?

cuanto es lento?

saludos
Jonathan Linenberg
2008-11-06 12:02:36 UTC
Permalink
Lucio Torre escribió:
On Wed, Nov 5, 2008 at 6:43 PM, Carlos Do Carmo <cdocarmo-***@public.gmane.org> wrote:

Me exprese mal, si lo hago cuando realizo un cambio.

Gracias, por responder.


otra buena manera de encontrar el problema es que postees un ejemplo
minimo de codigo donde se pueda observar el issue. La gente te va a
poder ayudar mas y a vos te va a servir el ejercicio.

Lucio.

---------------------------------------------------------------------
Para dar de baja la suscripcion, mande un mensaje a:
pyar-unsubscribe-***@public.gmane.org

Para obtener el resto de direcciones-comando, mande un mensaje a:
pyar-help-***@public.gmane.org

PyAr - Python Argentina - Sitio web: http://www.python.com.ar/




Lucio.

Acá va un cacho del código donde guardo datos en una tabla.



Estoy desarrollando con boa constructor.

Esto esta al iniciar el programa.

db = MySQLdb.connect(host="192.168.1.254", user="terminal",
passwd="11111", db="prueba", cursorclass=MySQLdb.cursors.DictCursor)
c = db.cursor()


Esto en un wx.Dialog(uso db y c en el ejemplo de abajo, pero en el
sistema uso unas variables globales)

try:

c.execute("START TRANSACTION")

sql = "INSERT INTO tipo_gasto (tipoG_Nom, tipoG_CtaCont)
Values (%s, %s) "
xDatos = (self.Nombre.GetValue(), xCta)

c.execute(sql, xDatos)

db.commit()

except Exception, e:
print e.__str__()
db.rollback()



Al hacer esto me graba en base de datos, sin salir del sistema me voy a
buscar los datos los veo, pero si otro usuario en otra maquina va a
buscar los datos no los ve hasta realizar alguna modificación en la base
de datos.

Para mostrar buscar los datos hago.


sql = "SELECT * FROM tipo_gasto "
c.execute(sql)
resultados = c.fetchall()
Probe hacer un commit antes de un select y ahi si veo los datos. hay
algo que queda colgado, ya que para que me refresque los datos que
ingreso otro usuario debo hacer un commit antes del select.

Le paso esto por si alguien ve algo que yo no.

Gracias, seguiré revisando.

Saludos



---------------------------------------------------------------------
Para dar de baja la suscripcion, mande un mensaje a:
pyar-unsubscribe-***@public.gmane.org

Para obtener el resto de direcciones-comando, mande un mensaje a:
pyar-help-***@public.gmane.org

PyAr - Python Argentina - Sitio web: http://www.python.com.ar/
________________________________

Carlos,

Después de evaluar los post de este thread. Te pregunto: ¿Hiciste algún *print* de las consultas, para constantar los resultados por consola y confirmar que los cambios no se hicieron?.

Te pregunto esto porque yo estoy con un problema también en wxPython, no me refresca los cambios dentro de wx.Dialog - en mi caso es un wx.BitmapButton - entonces lo que me lleva a pensar es que *no es la conexion a la base* sino que la intefaz gráfica no refresca los cambios.

Proba esto, hace un print de la consulta y contatá que los cambios no se hicieron, contanos. Es posible que, mal encaramos la solución, quizás no es la base de datos sino la interfaz gráfica la que no te muestra los cambios. Igualmente todos los post que te dieron con consejos para la realización de tu aplicación son válidos y muy útiles.

Saludos.



Yahoo! Cocina
Recetas prácticas y comida saludable
http://ar.mujer.yahoo.com/cocina/
Facundo Batista
2008-11-11 10:47:27 UTC
Permalink
El día 5 de noviembre de 2008 17:15, Carlos Do Carmo
Post by Carlos Do Carmo
Lo que vuelve lento es el connect, probé hacer el connect al iniciar el
sistema, pero si se realiza alguna modificación desde otro equipo no se
actualiza, se debe salir y volver a entrar para ver el cambio realizado por
otro.
Tenés razón, lo que es lento es conectarse. Hay que conectarse sólo al
principio, y luego utilizar la conexión.

Tu problema es que no estás viendo los cambios que se hacen desde otro
equipo. Pero deberían verse. Lo más probable es que no se estén
haciendo los commits desde el *otro* equipo. ¿Cómo se están efectuando
los cambios ahí?
Post by Carlos Do Carmo
Mi consulta es,
Esta bien lo que estoy haciendo, realizar el connect cada ves que
realizo una consulta a la db.
No.
--
. Facundo

Blog: http://www.taniquetil.com.ar/plog/
PyAr: http://www.python.org/ar/
Continue reading on narkive:
Loading...