[AYUDA] Optimizar Consulta

Iniciado por Rudy21, 26 Agosto 2013, 10:37 AM

0 Miembros y 1 Visitante están viendo este tema.

Rudy21

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.


1mpuls0

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

Código (sql) [Seleccionar]
show create table nombre_tabla

o

Código (sql) [Seleccionar]
explain nombre_tabla
abc

Rudy21

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


Rudy21

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 ;)


1mpuls0

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.
abc

1mpuls0

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.
abc

Rudy21

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?