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. Hola muy buenas, Como optimizaríais esta consulta que no sea tan lenta? @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código SQL: Ver original SELECT             ...
  #1 (permalink)  
Antiguo 19/12/2013, 04:04
Avatar de syntex  
Fecha de Ingreso: noviembre-2002
Ubicación: Cataluña
Mensajes: 978
Antigüedad: 21 años, 5 meses
Puntos: 4
Optimizar consulta

Hola muy buenas,

Como optimizaríais esta consulta que no sea tan lenta?

Código SQL:
Ver original
  1. SELECT
  2.                     DISTINCT (`stock`.`id_almacen`),
  3.                     `articulos`.`id`,
  4.                     `articulos`.`ref`,
  5.                     `articulos`.`titulo_1`,
  6.                     `articulos`.`id_iva`,
  7.                     `almacenes`.`id` `id_almacen`,
  8.                     `almacenes`.`codigo`,
  9.                     `almacenes`.`nombre`,
  10.                     (SELECT (SUM(`entradas`)-SUM(`salidas`)) FROM `stock` `st` WHERE (`st`.`id_articulo` = `articulos`.`id` && `st`.`id_almacen` = `almacenes`.`id`)) `FINAL`,
  11.                     (SELECT ROUND(`st`.`precio1`,2) FROM `stock` `st` WHERE (`st`.`id_articulo` = `articulos`.`id` && `st`.`id_almacen` = `almacenes`.`id` && `st`.`concepto` = 'EuroWin') LIMIT 1) `precio1`,
  12.                     `articulos`.`precio1` `articulo_precio1`,
  13.                     `articulos`.`create_user`,
  14.                     `articulos`.`create_tienda`,
  15.                     `iva`.`iva`,
  16.                     `precio_fijo`
  17.                 FROM
  18.                     `stock`
  19.                 INNER JOIN `articulos` ON `stock`.`id_articulo` = `articulos`.`id`
  20.                 INNER JOIN `almacenes` ON `stock`.`id_almacen` = `almacenes`.`id`
  21.                 INNER JOIN `iva` ON iva.id = id_iva
  22.                 LEFT JOIN `articulos_preciofijo` ON `stock`.`id_articulo` = `articulos_preciofijo`.`id_articulos`
Lo que e marcado en negro es lo que creo que no es correcto.

Mostrando registros 0 - 29 ( 23,958 total, La consulta tardó 0.0102 seg)

Pero e comprobado que el sql a tardado 5 segundos, me podeis ayudar?

Muchísimas gracias.
__________________
------------------------------------------------
La paciencia es el rey de la ciencia
------------------------------------------------


Última edición por gnzsoloyo; 19/12/2013 a las 04:34 Razón: Usar Highlights, por favor. Los resaltados en un codigo SQL se hacen por medio de comments, no de negritas.
  #2 (permalink)  
Antiguo 19/12/2013, 04:35
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: Optimizar consulta

Usar Highlights, por favor.
Los resaltados en un código SQL se hacen por medio de comments, no de negritas.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 19/12/2013, 05:45
Avatar de syntex  
Fecha de Ingreso: noviembre-2002
Ubicación: Cataluña
Mensajes: 978
Antigüedad: 21 años, 5 meses
Puntos: 4
Respuesta: Optimizar consulta

Sabiéndolo así aré. Cada día se aprende. Muchísimas gracias. Espero a ver si alguien me ayuda.
__________________
------------------------------------------------
La paciencia es el rey de la ciencia
------------------------------------------------

  #4 (permalink)  
Antiguo 19/12/2013, 06:07
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: Optimizar consulta

Sería mejor que nos dijeras los nombres de las tablas, las relaciones, los tipos de campos y con ejemplos nos aclararas qué quieres obtener teniendo qué, y qué es lo que has intentado.
  #5 (permalink)  
Antiguo 19/12/2013, 06:25
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: Optimizar consulta

Empecemos probando estoy dime si los resultados son los mismos que tenías antes, y de no serlo, en qué se diferencian.
Ten en cuenta que nosotros no tenemos ni tus tablas ni tus datos, por lo que estamos suponiendo muchas cosas en base a lo que pousiste en la consulta.
Código MySQL:
Ver original
  1.     S.`id_almacen`,
  2.     A.`id`,
  3.     A.`ref`,
  4.     A.`titulo_1`,
  5.     A.`id_iva`,
  6.     AL.`id` `id_almacen`,
  7.     AL.`codigo`,
  8.     AL.`nombre`,
  9.     ((SUM(`entradas`) - SUM(`salidas`)) Final,
  10.     IF(S.`concepto` = 'EuroWin', ROUND(`st`.`precio1`,2), 0.00) `precio1`,
  11.     A.`precio1` `articulo_precio1`,
  12.     A.`create_user`,
  13.     A.`create_tienda`,
  14.     A.`iva`,
  15.     AP.precio_fijo
  16.     `stock` S
  17.     INNER JOIN `articulos` A ON S.`id_articulo` = A.`id`
  18.     INNER JOIN `almacenes` AL ON S.`id_almacen` = S.`id`
  19.     INNER JOIN `iva` I ON I.id = A.id_iva
  20.     LEFT JOIN `articulos_preciofijo` AP ON S.`id_articulo` = AP.`id_articulos`
  21. GROUP BY S.`id_almacen`
__________________
¿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 19/12/2013, 11:05
Avatar de syntex  
Fecha de Ingreso: noviembre-2002
Ubicación: Cataluña
Mensajes: 978
Antigüedad: 21 años, 5 meses
Puntos: 4
Respuesta: Optimizar consulta

Ufffff muchísimas gracias, más que impresionante el remplazar DISTINCT por GROUP BY

Retocando un poco e hecho esto y el resultado de momento es perfecto:

Código MySQL:
Ver original
  1.                     `articulos`.`id`,
  2.                     `articulos`.`ref`,
  3.                     `articulos`.`titulo_1`,
  4.                     `articulos`.`id_iva`,
  5.                     `almacenes`.`id` `id_almacen`,
  6.                     `almacenes`.`codigo`,
  7.                     `almacenes`.`nombre`,
  8.                     ROUND(SUM(`entradas`)-SUM(`salidas`),0) `FINAL`,
  9.                     IF(`stock`.`concepto` = 'EuroWin', ROUND(`stock`.`precio1`,2), '') `precio1`,
  10.                     `articulos`.`precio1` `articulo_precio1`,
  11.                     `articulos`.`create_user`,
  12.                     `articulos`.`create_tienda`,
  13.                     `iva`.`iva`,
  14.                     `precio_fijo`
  15.                 FROM
  16.                     `stock`
  17.                 INNER JOIN `articulos` ON `stock`.`id_articulo` = `articulos`.`id`
  18.                 INNER JOIN `almacenes` ON `stock`.`id_almacen` = `almacenes`.`id`
  19.                 INNER JOIN `iva` ON iva.id = id_iva
  20.                 LEFT JOIN `articulos_preciofijo` ON `stock`.`id_articulo` = `articulos_preciofijo`.`id_articulos`
  21.                 GROUP BY
  22.                     `stock`.`id_almacen`
__________________
------------------------------------------------
La paciencia es el rey de la ciencia
------------------------------------------------

  #7 (permalink)  
Antiguo 19/12/2013, 11:17
Avatar de syntex  
Fecha de Ingreso: noviembre-2002
Ubicación: Cataluña
Mensajes: 978
Antigüedad: 21 años, 5 meses
Puntos: 4
Respuesta: Optimizar consulta

Una cosa veo que la consulta es un poco lenta:

E realizado explain:

Código MySQL:
Ver original
  1. EXPLAIN SELECT `articulos`.`id` , `articulos`.`ref` , `articulos`.`titulo_1` , `articulos`.`id_iva` , `almacenes`.`id` `id_almacen` , `almacenes`.`codigo` , `almacenes`.`nombre` , ROUND( SUM( `entradas` ) - SUM( `salidas` ) , 0 ) `FINAL` , IF( `stock`.`concepto` = 'EuroWin', ROUND( `stock`.`precio1` , 2 ) , '' ) `precio1` , `articulos`.`precio1` `articulo_precio1` , `articulos`.`create_user` , `articulos`.`create_tienda` , `iva`.`iva` , `precio_fijo` FROM `stock` INNER JOIN `articulos` ON `stock`.`id_articulo` = `articulos`.`id` INNER JOIN `almacenes` ON `stock`.`id_almacen` = `almacenes`.`id` INNER JOIN `iva` ON iva.id = id_iva LEFT JOIN `articulos_preciofijo` ON `stock`.`id_articulo` = `articulos_preciofijo`.`id_articulos` GROUP BY `stock`.`id_almacen` ;

Y me indica esto:
Código HTML:
Ver original
  1. Filas: 5
  2. id  select_type     table   type    possible_keys   key     key_len     ref     rows    Extra
  3. 1   SIMPLE  stock   ALL     stock1,stock2,stock3,stock6     NULL    NULL    NULL    27511   Using temporary; Using filesort
  4. 1   SIMPLE  almacenes   eq_ref  PRIMARY     PRIMARY     4   stock.id_almacen    1  
  5. 1   SIMPLE  articulos_preciofijo    ref     articulos_preciofijo1   articulos_preciofijo1   5   stock.id_articulo   1  
  6. 1   SIMPLE  articulos   eq_ref  PRIMARY,fk_iva_articulos,class_visitasweb3,class_v...   PRIMARY     4   stock.id_articulo   1   Using where
  7. 1   SIMPLE  iva     eq_ref  PRIMARY     PRIMARY     4   articulos.id_iva    1   Using where
__________________
------------------------------------------------
La paciencia es el rey de la ciencia
------------------------------------------------


Etiquetas: join, registro, select, sql
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 21:38.