7 messages in com.mysql.lists.mysql-esRE: JOIN muy lento
FromSent OnAttachments
Luciano A.F.25 Apr 2007 19:17 
Cruz, Edwin (GE, Corporate, consultant)26 Apr 2007 07:39 
Grover Campos A.26 Apr 2007 07:57 
Luciano A.F.26 Apr 2007 18:10 
Luciano A.F.27 Apr 2007 21:43 
Luciano A.F.01 May 2007 09:03 
Cruz, Edwin (GE, Corporate, consultant)01 May 2007 09:17 
Subject:RE: JOIN muy lento
From:Luciano A.F. (lua@yahoo.com.ar)
Date:04/27/2007 09:43:44 PM
List:com.mysql.lists.mysql-es

He aquí el detalle prometido:

CREATE TABLE `des` ( `ID` int(11) NOT NULL default '0', `HORA` int(11) NOT NULL default '0', `LOCAL` int(11) NOT NULL, PRIMARY KEY (`ID`,`HORA`), KEY `IDX_ID` (`ID`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1;

CREATE TABLE `carga` ( `ID` int(11) NOT NULL default '0', `HORA_CARGA` int(11) NOT NULL default '0', `LOCAL` int(11) NOT NULL, PRIMARY KEY (`ID`,`HORA_CARGA`), KEY `IDX_ID` (`ID`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1;

El indice IDX_ID lo agregue recientemente para ver si mejoro el rendimiento pero tampoco lo he logrado.

Las siguientes consultas que les maestro son las famosas consultas 'lentisimas' de las cuales hablé:

Si realizo la siguiente consulta: EXPLAIN SELECT D.local, D.hora, C.hora_carga FROM carga C INNER JOIN DES D USING(id) WHERE C.hora_carga BETWEEN UNIX_TIMESTAMP()-24*3600 AND UNIX_TIMESTAMP()

Esto es lo que me devuelve: 1 SIMPLE D ALL PRIMARY,IDX_ID NULL NULL NULL 26751 1 SIMPLE C ref PRIMARY,IDX_ID IDX_ID 4 coq.D.ID 1 Using where

Ni hablar si ejecuto la misma consulta con un par de MAX, MIN y GROUP BY.

Por otro lado, algo he leido acerca del Explain, pero aun no lo tengo muy claro, así que cualquier repuesta que obtenga me estarán haciendo un gran favor.

Gracias.

-----Mensaje original----- De: Luciano A.F. [mailto:lua@yahoo.com.ar] Enviado el: Jueves, 26 de Abril de 2007 22:11 Para: mysq@lists.mysql.com Asunto: RE: JOIN muy lento

Esta en lo cierto, mi información fue muy acotada, pero quizas mi caso era usual y no requería mas detalles.

Prometo para mañana (pues ahora no tengo la BD a mi alcance) la estructura de las tablas en cuestión y las consultas realizadas.

Adelanto por el momento que estoy utilizando MySQL 5.0.27 sobre QNX 6 como SO.

Gracias.

-----Mensaje original----- De: Grover Campos A. [mailto:gcam@ing.puc.cl] Enviado el: Jueves, 26 de Abril de 2007 11:58 Para: mysq@lists.mysql.com Asunto: RE: JOIN muy lento

La información que das es insuficiente, es como si fueras al doctor y le dices: "doctor, me duele la cabeza, ¿Qué puede ser?". Pásanos más información: parte de estructura, los índices, el explain de la consulta, etc.

Te aseguro que así sería más fácil :-D

--------------------------------------------------------- Grover M. Campos Ancajima Ingeniero de Desarrollo DictUC - Pontificia Universidad Católica de Chile

-----Mensaje original----- De: Luciano A.F. [mailto:lua@yahoo.com.ar] Enviado el: Miércoles, 25 de Abril de 2007 22:18 Para: mysq@lists.mysql.com Asunto: JOIN muy lento

Tengo 5 tablas, de unos 39000 registros cada una aproximadamente.

Las normalización está bien hecha, al menos eso creo. Para que tengan una idea, las tablas son asi:

T1 tiene campos ID, HORA,

T2 tiene campos ID, VALOR,

T3, T4 y T5 son similares a T2.

Si hago una consulta del tipo:

SELECT

FROM

T1

INNER JOIN T2 USING(ID)

INNER JOIN T3 USING(ID)

INNER JOIN T4 USING(ID)

INNER JOIN T5 USING(ID)

WHERE

T1.HORA BETWEEN

El tiempo que tarda la consulta es excesivo.

Mi pregunta es ¿Cómo ejecuta la consulta MySQL? ¿en que orden va armando el JOIN? ¿Primero arma todos los JOINS y recién allí aplica el filtro del WHERE?

Porque de ser así, con se criterio no me convendría ejecutar:

SELECT

FROM

(SELECT * FROM T1 HORA BETWEEN

INNER JOIN T2 USING(ID)

INNER JOIN T3 USING(ID)

INNER JOIN T4 USING(ID)

INNER JOIN T5 USING(ID)

Saludos. Gracias.