MySQL - Ayuda optimizar funciones de mysql

   
Vista:

Ayuda optimizar funciones de mysql

Publicado por Richard (2 intervenciones) el 26/03/2015 16:22:32
Hola a todos:

Mi problema es lo siguiente

La cantidad de información en mi BD es 5 000 000 de registros. Entonces quiero realizar una consulta a esa tabla uniendo con casi 8 tablas. Además uso la función SUMA y GROUP BY para agrupar el resultado.
Por usar el GROUP BY y SUM no terminar de cargar o sea se queda pensando . Mi query es como sigue

SELECT
mudmd.id AS id,
d.pliego AS pliego_regional,
d.nombre AS dre_nombre,
uej.codigo AS codigo_ejecutora,
uej.nombre AS unidad_ejecutora,
u.nombre AS ugel_nombre,
i.codigo_modular AS ie_codigo,
i.nombre AS ie_nombre,
m.id AS material_id,
m.nombre AS material_nombre,
um.nombre AS unidad_medida,
ine.nombre AS nivel_educativo,
CASE m.eib WHEN 0 THEN 'NO' WHEN 1 THEN 'SI' END AS material_eib,
CASE m.buen_inicio_ano_escolar WHEN 0 THEN 'NO' WHEN 1 THEN 'SI' END AS material_buen_inicio,
CASE i.estado WHEN 0 THEN 'INACTIVO' WHEN 1 THEN 'ACTIVO' END AS estado_ie,
DATE_FORMAT(mudm.fecha_salida,'%d/%m/%Y') AS fecha_salida,
DATE_FORMAT(mudm.fecha_entrega,'%d/%m/%Y')AS fecha_llegada,
( SELECT DATE_FORMAT(muff.fecha_finalizado,'%d/%m/%Y')
FROM mat_ugel_distribucion_material_finalizacion muff
WHERE muff.ugel_id=u.id
AND muff.material_id=m.id
AND muff.fecha_envio=mudm.fecha_salida
LIMIT 1
)AS fecha_finalizacion,
SUM(mudmd.cantidad) AS cantidad,
r.nombre AS region,
pr.nombre AS provincia,
dis.nombre AS distrito,
cp.nombre AS centro_poblado,
m.id AS material_id,
g.id AS grado_id,
g.nombre AS grado_nombre,
mu.nombre AS usuario,
ia.codigo AS ie_codigo_anexo,
CASE ine.id WHEN 1 THEN (SELECT nombre FROM ie_modalidad WHERE id=i.ie_modalidad_id LIMIT 1) ELSE 'NO APLICA' END AS nombre_ie_modalida,
CASE ine.id
WHEN 2 THEN
(SELECT nombre FROM ie_caracteristica WHERE id=i.ie_caracteristica_id LIMIT 1)
ELSE 'NO APLICA'
END AS nombre_ie_caracteristica,
iar.nombre AS ie_area,
i.id AS ie_id,
SUM(m.peso * mudmd.cantidad) AS peso_material,
SUM(m.volumen * mudmd.cantidad) AS volumen_material,
SUM(m.costo * mudmd.cantidad) AS costo_material,
mudm.empresa_transporte AS empresa_transporte,
mudm.zona_distribucion AS zona_distribucion,
mudm.numero_pecosa AS numero_pecosa
SUM(IF(mudmd.cantidad>0,1,0)) AS cantidad_dis_aprobado
FROM mat_ugel_distribucion_material mudm
INNER JOIN mat_ugel_distribucion_material_estado mudme ON mudm.mat_ugel_distribucion_material_estado_id=mudme.id
INNER JOIN mat_ugel_distribucion_material_detalle mudmd ON mudm.id=mudmd.mat_ugel_distribucion_material_id
INNER JOIN ie i ON mudm.ie_id=i.id
INNER JOIN ie_anexo ia ON i.ie_anexo_id=ia.id
INNER JOIN ugel u ON i.ugel_id=u.id
INNER JOIN dre d ON u.dre_id=d.id
INNER JOIN material m ON mudmd.material_id=m.id
INNER JOIN mat_unidad_medida um ON m.unidad_medida_id=um.id
INNER JOIN ie_nivel_educativo ine ON m.ie_nivel_educativo_id=ine.id
INNER JOIN mat_usuario mu ON m.mat_usuario_id=mu.id
INNER JOIN grado g ON mudmd.grado=g.id
INNER JOIN unidad_ejecutora uej ON u.unidad_ejecutora_id=uej.id
INNER JOIN centro_poblado cp ON i.centro_poblado_id=cp.id
INNER JOIN distrito dis ON cp.distrito_id=dis.id
INNER JOIN provincia pr ON dis.provincia_id=pr.id
INNER JOIN region r ON pr.region_id=r.id
INNER JOIN ie_area iar ON i.ie_area_id=iar.id
WHERE mudm.estado=1
AND mudme.es_distribucion_minedu=0
AND mudm.ano= 2014
GROUP BY i.id,m.id
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de xve

Ayuda optimizar funciones de mysql

Publicado por xve (899 intervenciones) el 26/03/2015 16:54:10
Hola Richard, no se que indices tienes, pero los JOIN con tantos registros puede ser que vaya todo bastante lento... te puede tardar horas dependiendo de lo que solicites y la memoria que tenga el servidor.

Muchas veces es mejor haces mas selec's con tal de eliminar JOIN's
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda optimizar funciones de mysql

Publicado por Richard (2 intervenciones) el 26/03/2015 17:15:43
Por favor podrías mostrar como hacer varios selects en vez de JOINS
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de xve

Ayuda optimizar funciones de mysql

Publicado por xve (899 intervenciones) el 26/03/2015 19:57:31
Lo que me refiero, es que si por ejemplo, un JOIN es para saber el distrito del usuario, y en la tabla distritos hay muchos registros, a lo mejor sale mas a cuenta, una vez realizada tu consulta, haces un select para buscar el distrito de es usuario en la tabla de distritos... de esta manera eliminas un JOIN... aunque luego tengas que hacer un select por cada registro en la tabla distrito, puede ser mas rápido que la vinculación.

Espero que me haya sabido explicar... coméntanos, ok?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar