Optimizar Conexiones BBDD Mysql


Objetivo: Optimizar Conexiones BBDD Mysql
Hola, estoy programando con gambas 3 y conectando a una bbdd externa de mysql.

para conectar lo hago así:

With cn
.type = "mysql"
.host = "www.miservidor.com"
.login = "misusuario"
.password = "mipasswd"
.name = "mibbdd"
end with

Hasta aqui todo bien, puedo hacer todo lo necesario, selects, inputs, de todo. El problema es que mi programa necesita muchos datos para hacer sus cálculos, y uso muchos results para coger info y actualizar en la BBDD. Cada result lo hago con cn.exec("select ... WHERE tal") o bien con cn.exec("update tabla set campo= etc") o con cn.exec("insert into...") etc.
Bien, funcionar funciona, pero, aqui viene mi pregunta, ¿cómo puedo hacer para que la cantidad de info q viaja por internet en cada result llegue más rápido? ¿hay manera de optimizar las conexiones o gestionarlas para que no tarde tanto? lo digo pq tengo tablas con 25.000 registros y claro, en local funciona perfecto, pero en remoto tarda un montón... ¿Debería cambiar algo en la bbdd? ¿o en la forma como uso los results?

Espero haberme explicado y que álguien pueda ayudarme

Muchas gracias

Perfil MP  
Objetivo: Re: Optimizar Conexiones BBDD Mysql
Hola fua:

No creo que sea un problema de gambas, o de como usas los result, puede que incluso el problema (o la forma de solucionarlo), sea la conexión contratada con la compañía que te dé el servicio de ADSL.

A lo mejor necesitas una linea "profesional", con más ancho de banda de "bajada".

Supongo que también incluye como tengas organizado la base de datos, con sus tablas y campos, pero eso seguramente será un problema de lo rápido que sea el ordenador "servidor", para resolver la consulta y empezar a enviarte el resultado.

Otro detalle (supongo que lo tendrás en cuenta), es que las consultas solo devuelvan los datos que realmente necesites y no registros completos.

Seguramente los compañeros del foro te podrán dar más pistas o soluciones.

Saludos

Objetivo: Re: Optimizar Conexiones BBDD Mysql
Citar:
en local funciona perfecto, pero en remoto tarda un montón.


Eso es normal porque el mio lo ejecuto en red lan a traves de un wifi y a veces los datos consultados duran en cargarse, yo he mirado los sistemas bancarios cuando a uno le consultan los datos de cuenta y los mismos banqueros te dicen espera un momento y al rato el sistema muestra los datos, lo mismo suceden con los nuestros y fuera de eso depende de la conexion a internet.

Objetivo: Re: Optimizar Conexiones BBDD Mysql
Una cosa que cambia drásticamente la velocidad, cuando se trata de bucles de actualizaciones es utilizar las transacciones BEGIN y COMMIT
Por ejemplo si quieres actualizar una tabla con las operaciones hechas sobre otra (en el ejemplo grabas en tabla dos el producto de dos campos de tabla1
sería algo así:

dim r as result
dim r2 as result2

r=miconexion.exec("select * from tabla_uno")
mocinexion.Begin
while r.available
r2=miconexion update"tabla_dos", "indice",r!campo1)
r2!campo1 = r!campo2 * r!campo3
r2.update
r.movenext
wend
miconexion.commit

O si tienes varias operaciones independientes, sería algo así:

miconexion.Begin
miconexion.exec("insert into mi_tabla select * from otra_tabla where mi_tabla.campo1=\"" & mitextbox1.Text & "\"")
miconexion.exec("insert into mi_tabla2 select * from otra_tabla2 where mi_tabla2.campo1=\"" & mitextbox2.Text & "\"")
miconexion.exec("insert into mi_tabla3 select * from otra_tabla3 where mi_tabla3.campo1=\"" & mitextbox3.Text & "\"")
miconexion.Commit


Por último, aunque sólo funciona para añadir registros, hay una técnica que funciona de mil maravillas
Public sub subirdatos()
'primero generas un fichero con extensión .csv de los datos que quieres añadir. Más o menos así:
dim af as result
dim mifichero,misdatos as string

mifichero=user.home &/ "datos.csv"
'en el ejemplo selecciono registros de una tabla y genero el csv a partir de ellos. En realidad puedes hacer lo que quieras con tal de que al final tengas el fichero csv
af = miconexion.exec("select * from tabla1")
WHILE af.Available
misdatos &= "\"\";\"" & af!campo1 & "\";\"" & af!campo2 & "\";\"" & mivariableprivada_o_lo_que_sea & "\"" 'el primer campo lo dejo vacío, que es lo que hay que hacer cuando tiene una clave primaria autonumérica
af.movenext
wend
file.save(mifichero,misdatos)
subeficheroFTP(flname, mifichero) 'Esta función te sube el fichero usando ftp al servidor
cloaddata = "LOAD DATA INFILE '" & mifichero & "' INTO TABLE `tabladestino` FIELDS TERMINATED BY ';' ENCLOSED BY '\"' ESCAPED BY '\\\\' LINES TERMINATED BY '\n'"
comun.condatos.consultar(cloaddata, TRUE)

end

PUBLIC FUNCTION subefichero(origen AS String, destino AS String) AS Boolean

DIM ftpc AS NEW FtpClient
ftpc.URL = "192.168.0.100" &/ destino ' Es decir la ip de tu servidor más el nombre del archivo
ftpc.User = "miusuarioftp"
ftpc.Password = "miclavedeusuarioftp"
ftpc.Async = FALSE
ftpc.Put(origen)

END


Esta forma de añadir datos es tan rápida, que yo he llegado a veces a vaciar una tabla entera y volver a llenarla antes que embarcarme en una serie de updates e inserts en un bucle mucho más lentos.
En versiones antiguas de MySQL se admitía el comando LOAD DATA LOCAL INFILE etc. que subía el fichero local solito, pero en las versiones nuevas se le considera un hueco de seguridad y hay que ejecutar (o compilar no recuerdo bien) el server indicándole que la acepte. Mejor usar ftp.
Espero que te sirva de ayuda.
Saludos

última edición por shordi el Martes, 19 Noviembre 2013, 21:27; editado 3 veces
Perfil MP  
Objetivo: Re: Optimizar Conexiones BBDD Mysql
Muchas gracias, mi duda era por si estaba haciendo algo mal o que se podía mejorar desde el gambas en cuanto a los results. Ya veo que no, así que tendré q optar por optimizar al máximo cada conexión como dice shordi, buscando sistemas q tarden lo menos posible y mejorando en lo posible los selects q mando...

Saludos y resuelto

Perfil MP  
Objetivo: Re: Optimizar Conexiones BBDD Mysql
fua escribió: [Ver mensaje]
Muchas gracias, mi duda era por si estaba haciendo algo mal o que se podía mejorar desde el gambas en cuanto a los results. Ya veo que no, así que tendré q optar por optimizar al máximo cada conexión como dice shordi, buscando sistemas q tarden lo menos posible y mejorando en lo posible los selects q mando...

Saludos y resuelto


Bienvenido, fua

Una cosa más, revisa las normas del Foro, no está permitido el uso de abreviaturas tipo SMS.

Gracias y saludos

Perfil MP  

Página 1 de 1


  
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas
No puede adjuntar archivos
Puede descargar archivos
No puede publicar eventos en el calendario

   

Está utilizando la versión (Lo-Fi). Para ver la versión completa del foro, haga clic aquí.

Powered by Icy Phoenix based on phpBB
Design by DiDiDaDo

Página generada en:: 0.2015s (PHP: -45% SQL: 145%)
Consultas SQL: 30 - Debug off - GZIP Activado