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

Performance queries con múltiples JOIN.

Estas en el tema de Performance queries con múltiples JOIN. en el foro de Mysql en Foros del Web. Hola, Tengo una consulta, no muy grande y hasta donde entiendo no debería ser tan ineficaz. Actualmente tarda ~110s, la tabla no contiene muchos registros ...
  #1 (permalink)  
Antiguo 13/02/2014, 21:39
Avatar de Carlangueitor
Moderador ლ(ಠ益ಠლ)
 
Fecha de Ingreso: marzo-2008
Ubicación: México
Mensajes: 10.037
Antigüedad: 16 años, 8 meses
Puntos: 1329
Performance queries con múltiples JOIN.

Hola,

Tengo una consulta, no muy grande y hasta donde entiendo no debería ser tan ineficaz. Actualmente tarda ~110s, la tabla no contiene muchos registros (200k), lo que supongo que el problema está en el subquery, ¿alguna sugerencia?

Código MySQL:
Ver original
  1.     auctions_flight.id,
  2.     auctions_flight.`date`,
  3.     origins.code as origin_code,
  4.     origins.name as origin,
  5.     destinations.name as destination,
  6.     destinations.code as destination_code,
  7.     auctions_flight.num_seating,
  8.     auctions_flightprice.Price,
  9.     auctions_flightprice.currency
  10.     auctions_flight
  11.         INNER JOIN
  12.     auctions_flightprice ON auctions_flight.price_id = auctions_flightprice.id
  13.         INNER JOIN
  14.     locations_location as destinations ON auctions_flight.destination_location_id = destinations.id
  15.         INNER JOIN
  16.     locations_location as origins ON auctions_flight.origin_location_id = origins.id
  17.     auctions_flight.num_seating >= 3
  18.         AND origins.code = 'MEX'
  19.         AND auctions_flightprice.currency = 'MXN'
  20.         AND auctions_flightprice.Price = (SELECT
  21.             MIN(Price)
  22.         FROM
  23.             auctions_flightprice
  24.         WHERE
  25.             origin_location_id = auctions_flight.origin_location_id
  26.                 AND destination_location_id = auctions_flight.destination_location_id
  27.                 AND `date` = auctions_flight.`date`)
  28. ORDER BY auctions_flightprice.`Price`
  29. LIMIT 25;

Saludos.
__________________
Grupo Telegram Docker en Español
  #2 (permalink)  
Antiguo 14/02/2014, 04:09
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 8 meses
Puntos: 574
Respuesta: Performance queries con múltiples JOIN.

Código MySQL:
Ver original
  1. SELECT auctions_flight.id,
  2.     auctions_flight.`date`,
  3.     origins.code as origin_code,
  4.     origins.name as origin,
  5.     destinations.name as destination,
  6.     destinations.code as destination_code,
  7.     auctions_flight.num_seating,
  8.     auctions_flightprice.Price,
  9.     auctions_flightprice.currency
  10. FROM auctions_flight
  11.         INNER JOIN
  12.     auctions_flightprice ON auctions_flight.price_id = auctions_flightprice.id
  13.         INNER JOIN
  14.     locations_location as destinations ON auctions_flight.destination_location_id = destinations.id
  15.         INNER JOIN
  16.     locations_location as origins ON auctions_flight.origin_location_id = origins.id
  17.         INNER JOIN
  18.     (SELECT origin_location_id,
  19.                 destination_location_id,
  20.                 `date`,
  21.                 MIN(Price) MPrice
  22.         FROM auctions_flightprice
  23.         GROUP BY origin_location_id,
  24.                 destination_location_id,
  25.                 `date`
  26.     ) Sbc
  27.         ON auctions_flightprice.Price =Sbc.MPrice
  28.             AND Sbc.origin_location_id = auctions_flight.origin_location_id
  29.             AND Sbc.destination_location_id = auctions_flight.destination_location_id
  30.             AND Sbc.`date` = auctions_flight.`date`
  31. WHERE auctions_flight.num_seating >= 3
  32.     AND origins.code = 'MEX'
  33.     AND auctions_flightprice.currency = 'MXN'
  34. ORDER BY auctions_flightprice.`Price`
  35. LIMIT 25;

Esto correra mas y creo que debe dar lo mismo....

(Creo)
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.
  #3 (permalink)  
Antiguo 17/02/2014, 15:17
Avatar de Carlangueitor
Moderador ლ(ಠ益ಠლ)
 
Fecha de Ingreso: marzo-2008
Ubicación: México
Mensajes: 10.037
Antigüedad: 16 años, 8 meses
Puntos: 1329
Respuesta: Performance queries con múltiples JOIN.

Gracias! Efectivamente trabaja mucho más rápido, tarda ~20s, lo cuál tampoco es muy aceptable. Pero me di cuenta (por mi poco conocimiento en bases de datos y SQL) de otra manera de hacerlo.

Código MySQL:
Ver original
  1.     auctions_flight.id,
  2.     auctions_flight.date,
  3.     destinations.code as destination_code,
  4.     destinations.name as destination,
  5.     MAX(auctions_flight.num_seating) as num_seating,
  6.     auctions_flightprice.Price,
  7.     MIN(auctions_flightprice.Price) as price
  8.     auctions_flight
  9.         INNER JOIN
  10.     auctions_flightprice ON auctions_flight.price_id = auctions_flightprice.id
  11.         INNER JOIN
  12.     locations_location AS origins ON auctions_flight.origin_location_id = origins.id
  13.         INNER JOIN
  14.     locations_location AS destinations ON auctions_flight.destination_location_id = destinations.id
  15.     auctions_flight.num_seating >= 3
  16.         AND auctions_flight.price_id IS NOT NULL
  17.         AND auctions_flightprice.currency = 'MXN'
  18.         AND origins.code = 'MEX'
  19.         AND auctions_flight.date >= CURDATE()
  20. GROUP BY auctions_flight.date , auctions_flight.destination_location_id , auctions_flight.origin_location_id
  21. ORDER BY price , auctions_flight.date
  22. LIMIT 0 , 25;

Y hasta ahora funciona adecuadamente y a buen tiempo ~0.1s.


Saludos
__________________
Grupo Telegram Docker en Español
  #4 (permalink)  
Antiguo 18/02/2014, 01:32
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 8 meses
Puntos: 574
Respuesta: Performance queries con múltiples JOIN.

Y auctions_flight.id siempre corresponde a MIN(auctions_flightprice.Price) as price ?
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.
  #5 (permalink)  
Antiguo 18/02/2014, 11:54
Avatar de Carlangueitor
Moderador ლ(ಠ益ಠლ)
 
Fecha de Ingreso: marzo-2008
Ubicación: México
Mensajes: 10.037
Antigüedad: 16 años, 8 meses
Puntos: 1329
Respuesta: Performance queries con múltiples JOIN.

¿A que te refieres?

Lo que quiero lograr es de la auctions_flight obtener un vuelo por cada combinación de fecha, origen y destino, obtener el precio más bajo y obtener el número de asientos más alto de los que cumplen la combinación.

Hasta donde entiendo si es correcto como lo manejo, ¿no?

Saludos
__________________
Grupo Telegram Docker en Español
  #6 (permalink)  
Antiguo 20/02/2014, 07:25
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 8 meses
Puntos: 574
Respuesta: Performance queries con múltiples JOIN.

auctions_flight.id corresponde a un vuelo concreto

MIN(auctions_flightprice.Price) es el precio mínimo de los vuelos que cumplen las condiciones de busqueda.

Y ahora repregunto

Cita:
Y auctions_flight.id siempre corresponde a MIN(auctions_flightprice.Price) as price ?
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.
  #7 (permalink)  
Antiguo 20/02/2014, 10:24
Avatar de Carlangueitor
Moderador ლ(ಠ益ಠლ)
 
Fecha de Ingreso: marzo-2008
Ubicación: México
Mensajes: 10.037
Antigüedad: 16 años, 8 meses
Puntos: 1329
Respuesta: Performance queries con múltiples JOIN.

Ahh ya, realmente no importa el ID, por lo menos no para este caso, ya que justamente quiero obtener solo los datos del vuelo que cumpla las condiciones para mostrarlos en una lista de resultados, luego tomando esos mismos parámetros se hacen las operaciones siguientes si el usuario requiere.

Saludos
__________________
Grupo Telegram Docker en Español
  #8 (permalink)  
Antiguo 21/02/2014, 02:27
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 8 meses
Puntos: 574
Respuesta: Performance queries con múltiples JOIN.

??? tu sabras.... pero las operaciones deben hacerse sobre un vuelo concreto ... el del id si el id y el precio no corresponden ....????
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.
  #9 (permalink)  
Antiguo 21/02/2014, 10:21
Avatar de Carlangueitor
Moderador ლ(ಠ益ಠლ)
 
Fecha de Ingreso: marzo-2008
Ubicación: México
Mensajes: 10.037
Antigüedad: 16 años, 8 meses
Puntos: 1329
Respuesta: Performance queries con múltiples JOIN.

No del todo. Te explico un poco como funciona. Muestro los resultados para obtener el precio más bajo, luego, si se selecciona comprar, yo mando a otro sistema los parámetros de búsqueda (origen, destino, y fecha), y ese sistema ya da todas las opciones de precio y asientos disponibles con detalle. En este sistema solo se requieren obtener datos para el usuario.


Saludos
__________________
Grupo Telegram Docker en Español

Última edición por Carlangueitor; 21/02/2014 a las 10:49
  #10 (permalink)  
Antiguo 21/02/2014, 10:31
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Performance queries con múltiples JOIN.

Pregunta: ¿Has analizado la selectiividad que se aplica en cada tabla del JOIN?
Es decir, cuando no puedes evitar hacer un JOIN múltiple, hay que tratar de hacer que la cadena de tablas derivadas que se genera (de izquierda a derecha) vaya generando la menor cantidad de resultados.
digamos así, si sabemos que la cuarta tabla tiene alta selectividad (bajo nivel de resultados), y la segunda baja selectividad (alto nivel de resultados), es mejor cambiar el orden para que se reduzca la salida de datos.
En esencia, en ciertas condiciones el orden de los factores sí altera el producto...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #11 (permalink)  
Antiguo 21/02/2014, 10:59
Avatar de Carlangueitor
Moderador ლ(ಠ益ಠლ)
 
Fecha de Ingreso: marzo-2008
Ubicación: México
Mensajes: 10.037
Antigüedad: 16 años, 8 meses
Puntos: 1329
Respuesta: Performance queries con múltiples JOIN.

No lo había analizado, creo que entonces debería pasar al último el primer JOIN. Reviso a ver que obtengo.

Saludos!
__________________
Grupo Telegram Docker en Español

Etiquetas: join, performance, queries, registro, 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 17:32.