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

optimizacion consulta

Estas en el tema de optimizacion consulta en el foro de Mysql en Foros del Web. hola estoy intentando optimizar mi base de datos y me surgio la siguiente duda. tengo la siguiente consulta: select canales.nombre as medio_venta, sum(Ventas_d.cantidad)as total from ...
  #1 (permalink)  
Antiguo 27/11/2009, 11:44
 
Fecha de Ingreso: octubre-2008
Mensajes: 151
Antigüedad: 15 años, 5 meses
Puntos: 1
Pregunta optimizacion consulta

hola estoy intentando optimizar mi base de datos y me surgio la siguiente duda.

tengo la siguiente consulta:

select canales.nombre as medio_venta, sum(Ventas_d.cantidad)as total from Ventas_d, productos, Ventas_m,canales where ventas_m.medio_venta = canales.id_canal and ventas_d.id_producto = Productos.id_producto and ventas_d.id_venta = ventas_m.id_venta and productos.id_categoria = '9' and date(ventas_m.fecha) between "2009-11-25" and "2009-11-25" group by ventas_m.medio_venta order by canales.id_canal

utlize el "explain" para ver detallada la informaciond e la consulta y note que de las 4 tablas con las q estoy trabajando 3 tiene type = "eq_ref" y una de ellas "ALL", por lo que lei esto no es bueno, y lo que se me ocurrio es agregarle a esa tabla un campo numerico autoincrementado para que tenga una "key" pero aun asi me sigue devolviendo lo mismo, alguien sabe como puedo solucionarlo?

muchas gracias

Última edición por manoloOZ; 27/11/2009 a las 11:45 Razón: la etiqueta code no dejaba ver bien lo que habia adentro
  #2 (permalink)  
Antiguo 27/11/2009, 12:23
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, 4 meses
Puntos: 2658
Respuesta: optimizacion consulta

Por un lado, es mejor relacionar las tablas en el FROM y no en el WHERE, porque de lo contrario MySQL no las puede optimizar:

Código sql:
Ver original
  1. SELECT
  2.   C.nombre medio_venta,
  3.   SUM(VD.cantidad) total
  4. FROM
  5.   Ventas_d VD
  6.   INNER JOIN productos P ON VD.id_producto = P.id_producto
  7.   INNER JOIN Ventas_m VM ON VD.id_venta = VM.id_venta
  8.   INNER JOIN canales C ON VM.medio_venta = C.id_canal
  9. WHERE
  10. WHERE
  11.   P.id_categoria = '9'
  12.   AND DATE(VM.fecha) BETWEEN '2009-11-25' AND '2009-11-25'
  13. GROUP BY  VM.medio_venta
  14. ORDER BY C.id_canal

La cláusula "AS" es opcional, puedes suprimirla y de todos modos funciona.
Par aoptimizar más aún, puede que sea buena idea un índice de categorías de producto, o ventas + fecha.
Habría que ver...
__________________
¿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 27/11/2009, 12:25
 
Fecha de Ingreso: octubre-2008
Mensajes: 151
Antigüedad: 15 años, 5 meses
Puntos: 1
Respuesta: optimizacion consulta

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Por un lado, es mejor relacionar las tablas en el FROM y no en el WHERE, porque de lo contrario MySQL no las puede optimizar:

Código sql:
Ver original
  1. SELECT
  2.   C.nombre medio_venta,
  3.   SUM(VD.cantidad) total
  4. FROM
  5.   Ventas_d VD
  6.   INNER JOIN productos P ON VD.id_producto = P.id_producto
  7.   INNER JOIN Ventas_m VM ON VD.id_venta = VM.id_venta
  8.   INNER JOIN canales C ON VM.medio_venta = C.id_canal
  9. WHERE
  10. WHERE
  11.   P.id_categoria = '9'
  12.   AND DATE(VM.fecha) BETWEEN '2009-11-25' AND '2009-11-25'
  13. GROUP BY  VM.medio_venta
  14. ORDER BY C.id_canal

La cláusula "AS" es opcional, puedes suprimirla y de todos modos funciona.
Par aoptimizar más aún, puede que sea buena idea un índice de categorías de producto, o ventas + fecha.
Habría que ver...
muchas gracias, como tendria que hacer para crear ese índice?, no estoy muy seguro a que te referis con indices tampoco, seria como el id del registro?
  #4 (permalink)  
Antiguo 27/11/2009, 12:42
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, 4 meses
Puntos: 2658
Respuesta: optimizacion consulta

NO exactamente.
Una clave primaria genera lo que se denomina un indice cluster, y sólo puede haber uno por tabla. Los otros son índices no cluster o índices agrupados, y varían entre tres tipos distintos: HASH, BTREE e INDEX. Estos índices permiten tener diferentes formas de ordenar la información de tabla para ser usados en búsquedas.
Par alos detalles, es mejor que leas el manual de referencia (13.1.4. Sintaxis de CREATE INDEX)
La forma general es:
Código sql:
Ver original
  1. CREATE INDEX nombre_del_indice ON Tabla(campos);

En este capítulo se explica cómo es que usa MySQL los índices: 7.4.5. Cómo utiliza MySQL los índices
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
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 05:45.