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

consulta más optimizada

Estas en el tema de consulta más optimizada en el foro de Mysql en Foros del Web. Estimados, cual de las dos consultas está mejor (si las dos estan mal me dicen) lo estoy ejecutando sobre una base de datos de 20.000 ...
  #1 (permalink)  
Antiguo 11/12/2008, 17:27
Avatar de dieguicho  
Fecha de Ingreso: noviembre-2001
Ubicación: Buenos Aires
Mensajes: 1.190
Antigüedad: 22 años, 5 meses
Puntos: 1
consulta más optimizada

Estimados, cual de las dos consultas está mejor (si las dos estan mal me dicen)

lo estoy ejecutando sobre una base de datos de 20.000 registros y me da resultados intercalados, pero bastante parecidos...

ELECT users.username, MAX(photos.id) as id FROM users
INNER JOIN photos ON photos.user_id = users.id AND photos.status = 0
WHERE users.status = 0
GROUP BY users.id
ORDER BY photos.id DESC
LIMIT 0,6;

--------------------

SELECT users.username, MAX(photos.id) as id
FROM users, photos
WHERE users.id = photos.user_id AND users.status = 0 AND photos.status = 0
GROUP BY users.id
ORDER BY photos.id DESC
LIMIT 0,6;

gracias!!!
__________________
On error no hago nada porque deje de fumar...
  #2 (permalink)  
Antiguo 12/12/2008, 01:29
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: consulta más optimizada

Pues ni una ni la otra (del todo), la que se acerca más es la primera


Código:
SELECT users.username, MAX(photos.id) as id 
       FROM users INNER JOIN photos 
              ON photos.user_id = users.id 
WHERE users.status = 0 AND photos.status = 0
GROUP BY users.id
ORDER BY MAX(photos.id) DESC
LIMIT 0,6;
Eso da los ultimos 6 usuarios que han entrado alguna foto y el id de la ultima foto que ha entrado cada uno (por orden descendente del id de la ultima foto de cada uno).

Quim
  #3 (permalink)  
Antiguo 12/12/2008, 05:57
Avatar de dieguicho  
Fecha de Ingreso: noviembre-2001
Ubicación: Buenos Aires
Mensajes: 1.190
Antigüedad: 22 años, 5 meses
Puntos: 1
Respuesta: consulta más optimizada

Quim,
gracias por tu respuesta!
las dos consultas que pegué hacen lo mismo que la tuya, funcionan perfecto
solo quiero optimizarlas al maximo.

veo que pusiste ORDER BY MAX(photos.id) DESC,
eso es mas veloz que poner ORDER BY photos.id DESC ??

usar JOIN es mas rapido que la otra forma siempre?
__________________
On error no hago nada porque deje de fumar...
  #4 (permalink)  
Antiguo 12/12/2008, 06:06
Avatar de dieguicho  
Fecha de Ingreso: noviembre-2001
Ubicación: Buenos Aires
Mensajes: 1.190
Antigüedad: 22 años, 5 meses
Puntos: 1
Respuesta: consulta más optimizada

ah... y me tiró error la consulta
el mysql query browser dice que...

Invalid use of group function
__________________
On error no hago nada porque deje de fumar...
  #5 (permalink)  
Antiguo 12/12/2008, 06:10
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: consulta más optimizada

No se pueden usar funciones agregadas en ORDER BY ni en GROUP BY. Deben referirse a campos reales o provenientes de una subconsulta.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #6 (permalink)  
Antiguo 12/12/2008, 06:37
Avatar de dieguicho  
Fecha de Ingreso: noviembre-2001
Ubicación: Buenos Aires
Mensajes: 1.190
Antigüedad: 22 años, 5 meses
Puntos: 1
Respuesta: consulta más optimizada

entonces ORDER BY photos.id DESC seria lo correcto no?
pero ahi estaria ordenando por id (cualquiera de la tabla) o por los que ya encontro con MAX(photos.id) ?
__________________
On error no hago nada porque deje de fumar...
  #7 (permalink)  
Antiguo 12/12/2008, 07:51
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: consulta más optimizada

Analicemos bien el caso:
Este código:
Código sql:
Ver original
  1. SELECT users.username, MAX(photos.id) AS id
  2.        FROM users INNER JOIN photos
  3.               ON photos.user_id = users.id
  4. WHERE users.STATUS = 0 AND photos.STATUS = 0
  5. GROUP BY users.id
  6. ORDER BY MAX(photos.id) DESC
  7. LIMIT 0,6;
Esto te devuelve todos registros de usuarios y el ID de la foto de cada uno que sea el mayor para cada usuario.id. Si lo que deseas es que esas photo.id se ordenen, no lo puedes hacer en la misma sentencia, porque debes convertir la columna devuelta por la consulta en una columna real y no en el resultado de una función agregada. Eso se logra poniendo el resultado de esta consulta dentro de otra, como subconsulta:

Código sql:
Ver original
  1. SELECT username, id
  2. FROM (
  3.           SELECT users.username, MAX(photos.id) AS id
  4.           FROM users INNER JOIN photos
  5.               ON photos.user_id = users.id
  6.           WHERE users.STATUS = 0 AND photos.STATUS = 0
  7.           GROUP BY users.id ) Tabla1
  8. ORDER BY id DESC
  9. LIMIT 0,6;

De esta forma, la consulta se transforma en una tabla en memoria, y de esa tabla se toma el resultado de la consulta principal. Como la consulta principal opera sobre la tabla de memoria, ya toma datos prefiltrados y es muchísimo más rápida.

Pruébalo.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #8 (permalink)  
Antiguo 12/12/2008, 08:54
Avatar de dieguicho  
Fecha de Ingreso: noviembre-2001
Ubicación: Buenos Aires
Mensajes: 1.190
Antigüedad: 22 años, 5 meses
Puntos: 1
Respuesta: consulta más optimizada

buenisimo, la subconsulta se guarda en memoria..
la verdad corre rapidisimo! grande gnzsoloyo!
__________________
On error no hago nada porque deje de fumar...
  #9 (permalink)  
Antiguo 15/12/2008, 08:03
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: consulta más optimizada

A lo dicho por gnzsoloyo absolutamente de acuerdo!!! Lo siento fue un eceso de confianza lo de poner el max(id) en el order by... interprete que lo querrias ordenado por el id maximo y por eso lo puse pero es un error.

En cuanto a si join es mas rapido yo creo que si. Pero no todos los motores són iguales.... de lo que estoy seguro es de que es la forma correcta si tenemos en cuenta los manuales de SQL en mayusculas. Pero cada motor puede tener sus variaciones, yo siempre intento trabajar con el SQL mas estandar posible.

Por otro lado parece logico aqui

WHERE users.id = photos.user_id AND users.status = 0 AND photos.status = 0

se mezclan las restriciones con la llave de vinculación entre tablas mientras que aqui

ON photos.user_id = users.id
WHERE users.status = 0 AND photos.status = 0

el motor sabe de antemano que es cada cosa.


Quim
  #10 (permalink)  
Antiguo 15/12/2008, 21:55
Avatar de dieguicho  
Fecha de Ingreso: noviembre-2001
Ubicación: Buenos Aires
Mensajes: 1.190
Antigüedad: 22 años, 5 meses
Puntos: 1
Respuesta: consulta más optimizada

osea que users.status = 0 AND photos.status = 0 son restricciones
pense que para el motor era lo mismo que users.id = photos.user_id

por otro lado.. los INDEX solo funcionan si estan en el WHERE...
si uso JOINS no los estaria aprovechando... no?
__________________
On error no hago nada porque deje de fumar...
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 22:41.