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
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


0