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 año='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.
Para mejorar la base de datos.
Coloca indexes, foreing keys (relationship).
Citarwhere 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
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,
`año` 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
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 ;)
Hola.
Algo que pides además de la consulta es optimizar la base de datos.
Aquí algunas observaciones y sugerencias.
En la tabla clientes
Citar
`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?
Citar
`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
Citar
`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.
Cita de: Rudy21 en 27 Agosto 2013, 17:24 PM
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 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.co
saludos y de antemano gracias
p.d. alguna otra opcion para realizar esa tarea, una resta tal vez?