7 messages in com.mysql.lists.mysql-esRE: JOIN muy lento| From | Sent On | Attachments |
|---|---|---|
| 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.
-- Lista de Correos de MySQL Para el historial de la lista: http://lists.mysql.com/mysql-es Para cancelar inscripcin: http://lists.mysql.com/mysql-es?unsub=lua...@yahoo.com.ar
-- Lista de Correos de MySQL Para el historial de la lista: http://lists.mysql.com/mysql-es Para cancelar inscripción: http://lists.mysql.com/mysql-es?unsub=lua...@yahoo.com.ar




