Autor
|
Tema: [AYUDA] Optimizar Consulta (Leído 4,915 veces)
|
Rudy21
Desconectado
Mensajes: 154
Rudy21 Web Design
|
Buenas noches, tengo una consulta en MySQL que me está matando
les comento, anteriormente se corria el sistema en Visual Basic 2010 con una base de datos en ACCESS y funcionaba bien y rapido, el problema fue que ya no quisieron centralizado el sistema y se migro a un servidor online con MySQL
al hacer el cambio todo funciona perfectamente excepto esta consulta
select * from clientes where NoCliente not in (SELECT NoCliente from pagos where pagos.id In (select IdPago from Pagos_Detalle where Mes = 'Agosto' and anio='2013')) order by Nombre ASC
Se tiene una tabla clientes una de pagos y otra de detalle de pagos
en clientes pues los clientes en pagos se establece fecha y monto y a que cliente corresponde el pago en pago_detalles se pone que meses se pagaron de servicios
esa consulta lo que hace es sacar los clientes DEUDORES, es decir los que no han pagado este mes
en MySQL, incluso corriendolo desde phpMyAdmin, o consola, (hice la prueba ya que pensé que era error del conector ODBC) esa consulta tarda
357.512 segundos (casi 6minutos!!!!) en access me lo hacía en segundos sin problemas
Alguna idea para optimizar la consulta y hacerla más rápida
De antemano Gracias.
|
|
|
En línea
|
|
|
|
1mpuls0
Desconectado
Mensajes: 1.186
|
Para mejorar la base de datos. Coloca indexes, foreing keys (relationship). where Mes = 'Agosto' Deberías utilizar indices numéricos son más rápidos. Crees que puedas mostrar la estructura exacta de tus tablas? ya sea con SHOW CREATE TABLE nombre_tabla
o EXPLAIN nombre_tabla
|
|
|
En línea
|
abc
|
|
|
Rudy21
Desconectado
Mensajes: 154
Rudy21 Web Design
|
Clientes: CREATE TABLE `clientes` ( `NoCliente` varchar(50) COLLATE latin1_spanish_ci NOT NULL, `Nombre` varchar(100) COLLATE latin1_spanish_ci DEFAULT NULL, `Email` varchar(50) COLLATE latin1_spanish_ci DEFAULT NULL, `Telefono` varchar(15) COLLATE latin1_spanish_ci DEFAULT NULL, `Mac` varchar(50) COLLATE latin1_spanish_ci DEFAULT NULL, `Cp` varchar(10) COLLATE latin1_spanish_ci DEFAULT NULL, `Calle` varchar(50) COLLATE latin1_spanish_ci DEFAULT NULL, `Estado` varchar(100) COLLATE latin1_spanish_ci DEFAULT NULL, `Ciudad` varchar(100) COLLATE latin1_spanish_ci DEFAULT NULL, `Colonia` varchar(100) COLLATE latin1_spanish_ci DEFAULT NULL, `CodigoServicio` varchar(50) COLLATE latin1_spanish_ci DEFAULT NULL, `EquipoConectado` varchar(100) COLLATE latin1_spanish_ci DEFAULT NULL, `FechaAlta` datetime DEFAULT NULL, PRIMARY KEY (`NoCliente`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_spanish_ci
Pagos CREATE TABLE `pagos` ( `Id` int(11) NOT NULL AUTO_INCREMENT, `Fecha` date DEFAULT NULL, `NoCliente` varchar(50) COLLATE latin1_spanish_ci DEFAULT NULL, `Usuario` varchar(50) COLLATE latin1_spanish_ci DEFAULT NULL, `Importe` decimal(19,2) DEFAULT NULL, PRIMARY KEY (`Id`) ) ENGINE=InnoDB AUTO_INCREMENT=2014 DEFAULT CHARSET=latin1 COLLATE=latin1_spanish_ci
Pagos_Detalle CREATE TABLE `Pagos_Detalle` ( `Id` int(11) NOT NULL AUTO_INCREMENT, `IdPago` int(11) DEFAULT NULL, `Mes` varchar(25) COLLATE latin1_spanish_ci DEFAULT NULL, `anio` varchar(5) COLLATE latin1_spanish_ci DEFAULT NULL, `Importe` decimal(19,2) DEFAULT NULL, PRIMARY KEY (`Id`) ) ENGINE=InnoDB AUTO_INCREMENT=2397 DEFAULT CHARSET=latin1 COLLATE=latin1_spanish_ci
|
|
|
En línea
|
|
|
|
Rudy21
Desconectado
Mensajes: 154
Rudy21 Web Design
|
Al ejecutarlo en una maquina local la misma consulta con los mismos datos y la misma estructura, la consulta se mostró Showing rows 0 - 33 ( 34 total, Query took 0.0074 sec) asi que estoy viendo que son problemas de mi servidor y no tanto de la consulta voy a ver que es lo que está sucediendo Muchas Gracias
|
|
|
En línea
|
|
|
|
1mpuls0
Desconectado
Mensajes: 1.186
|
Hola. Algo que pides además de la consulta es optimizar la base de datos. Aquí algunas observaciones y sugerencias. En la tabla clientes `NoCliente` varchar(50) COLLATE latin1_spanish_ci NOT NULL,
Por qué es de tipo varchar y no int? Por qué tiene un tamaño de 50? `Cp` varchar(10)
Trata de ajustar más los tamaños de tus campos. Un CP nunca tendrá más de 5 caracteres. En la tabla Pagos_Detalle `año` varchar(5)
No uses caracteres extendidos en base de datos (ni en programación) (letra ñ) Como último pero no menos importante, trata de seguir una nomenclatura de variables.
|
|
|
En línea
|
abc
|
|
|
1mpuls0
Desconectado
Mensajes: 1.186
|
Al ejecutarlo en una maquina local la misma consulta con los mismos datos y la misma estructura, la consulta se mostró Showing rows 0 - 33 ( 34 total, Query took 0.0074 sec) asi que estoy viendo que son problemas de mi servidor y no tanto de la consulta voy a ver que es lo que está sucediendo Muchas Gracias Es lo que estaba por comentar, también ejecuté la consulta y no tuve problemas en cuanto a la sintaxis. Qué versión de mysql tienes en el servidor local y en el servidor del proveedor? Cuantos registros de información tienes en cada tabla? para hacer la consulta en el servidor local.
|
|
|
En línea
|
abc
|
|
|
Rudy21
Desconectado
Mensajes: 154
Rudy21 Web Design
|
En mi maquina local 5.6.12 en la maquina de mi servidor 5.1.70-cll de hecho me hice una cuenta en freemysqlhosting.com subi los datos y tambien en ese servidor se tarda bastante dejo los datos de acceso para que me echen un cable, no se que sea =S Host: sql2.freemysqlhosting.net Database name: sql217174 Database user: sql217174 Database password: vL6%qX2% Port number: 3306 el phpMyAdmin www.phpmyadmin.cosaludos y de antemano gracias p.d. alguna otra opcion para realizar esa tarea, una resta tal vez?
|
|
|
En línea
|
|
|
|
|
|