| 
	
		|  Autor | Tema: [AYUDA] Optimizar Consulta  (Leído 5,404 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 phpMyAdminwww.phpmyadmin.co saludos y de antemano gracias p.d. alguna otra opcion para realizar esa tarea, una resta tal vez? |  
						| 
								|  |  
								|  |  En línea | 
 
 |  |  |  |  |  
 
	
 
   |