Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Optimizar consulta

Estas en el tema de Optimizar consulta en el foro de Mysql en Foros del Web. Buenas, tengo 2 tablas de documentos y versiones de los mismos, es decir Tabla Documento con campos id, nombre Tabla Versiones con campos id , ...
  #1 (permalink)  
Antiguo 12/01/2012, 10:28
 
Fecha de Ingreso: diciembre-2008
Mensajes: 190
Antigüedad: 15 años, 4 meses
Puntos: 6
Optimizar consulta

Buenas, tengo 2 tablas de documentos y versiones de los mismos, es decir

Tabla Documento
con campos id, nombre

Tabla Versiones
con campos id , docid , version


Suponiendo q tengo los siguientes registros:
Tabla Doc
id, nombre
1 doc1
2 docu2

y en versiones
id , docid , version
1 1 1
2 1 2
3 2 1
4 2 2
5 2 3

Es decir, en versiones tengo cargadas las 2 versiones del doc1 y las 3 del doc2 .

Cuando hago consultas de documentos siempre tengo q obtener la ultima versión, con lo cual tenia una consulta de este tipo:
Código MySQL:
Ver original
  1. Select * from documentos d  
  2. INNER JOIN versiones v  ON (v.docid = d.id)
  3.                             from documentos d
  4.                             INNER JOIN versiones v2 ON (v2.docid= d.id)
  5.                             WHERE
  6.                             v2.ordenProduccion=v.ordenProduccion
  7.                             GROUP BY (v2.ordenProduccion)
  8. )

Esto era aceptable hasta que se llego a una cantidad de registros donde la consulta demora 1.2 segundos.
De que manera puedo optimizarla?
Muchas gracias.
  #2 (permalink)  
Antiguo 12/01/2012, 11:09
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Optimizar consulta

Hola turfeano:

Creo que estás complicando demasiado la consulta, checa este script creo que obtienes el mismo resultado con una consulta más sencilla:

Código MySQL:
Ver original
  1. mysql> select * from documento;
  2. +------+--------+
  3. | id   | nombre |
  4. +------+--------+
  5. |    1 | doc1   |
  6. |    2 | docu2  |
  7. +------+--------+
  8. 2 rows in set (0.01 sec)
  9.  
  10. mysql> select * from versiones;
  11. +------+-------+---------+
  12. | id   | docid | version |
  13. +------+-------+---------+
  14. |    1 |     1 |       1 |
  15. |    2 |     1 |       2 |
  16. |    3 |     2 |       1 |
  17. |    4 |     2 |       2 |
  18. |    5 |     2 |       3 |
  19. +------+-------+---------+
  20. 5 rows in set (0.00 sec)
  21.  
  22. mysql> SELECT D.*, V.max_version FROM Documento D INNER JOIN
  23.     -> (SELECT MAX(`version`) max_version, docid FROM versiones GROUP BY docid)
  24. V ON D.id = V.docid;
  25. +------+--------+-------------+
  26. | id   | nombre | max_version |
  27. +------+--------+-------------+
  28. |    1 | doc1   |           2 |
  29. |    2 | docu2  |           3 |
  30. +------+--------+-------------+
  31. 2 rows in set (0.01 sec)

Recuerda también generar los índices respectivos para que las consultas sean más rápidas.

Saludos
Leo.
  #3 (permalink)  
Antiguo 12/01/2012, 13:16
 
Fecha de Ingreso: diciembre-2008
Mensajes: 190
Antigüedad: 15 años, 4 meses
Puntos: 6
Respuesta: Optimizar consulta

Bueno gracias, creo q es mas prolija pero no parece ser mas eficiente.
Saludos.
  #4 (permalink)  
Antiguo 12/01/2012, 13:28
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Optimizar consulta

Hola de nuevo turfeano:

Cita:
creo q es mas prolija pero no parece ser mas eficiente.
Por qué no ejecutas un EXPLAIN con ambas consultas y vez el comportamiento?

Te podría asegurar que los tiempos mejorarán considerablemente, veamos algunos problemas con la consulta que tu planteas:

Primero, en la subconsulta para obtener la versión máxima, no es necesario hacer un INNER JOIN, pues si observas en el SELECT sólo se manejan campos de la tabla Versiones (T2), con poner una condición en el WHERE sería suficiente.

Segundo, de la manera en que estás planteando la consulta, la subconsulta para obtener se ejecuta n veces, siendo n el número de registros que hay en tu tabla documentos, al poner la condición en el WHERE se tiene que evaluar con cada registro. En la que propongo yo, la subconsulta SOLO SE EJECUTA UNA VEZ, el resto simplemente es ligar los resultados obtenidos.

Tercero, poner un SELECT * no es recomendable, PUES ESTARÍAS REPITIENDO LOS CAMPOS COMUNES, por el contrario, debes listar solamente aquellos campos que realmente vas a utilizar.

Finalmente, si los tiempos de respuesta son semejantes entre las consultas, puedes seguir utilizando tu propuesta, mientras alguien más propone alguna otra mejora.

Saludos
Leo.

Etiquetas: campos, join, registros, select, tabla
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 13:17.