Tengo una consulta que me esta dando la lata

Tambien se me ha ocurrido que en lugar de que cada vez que se solicite esa consulta saque los datos actuales, a tiempo real, saque datos que ya han sido volcados a una pagina html. Es decir que MySQL un par de veces al dia actualice los datos en una pagina y asi cuando accedan a la consulta, el resultado sera instantaneo, aunque no sea a tiempo real, que les da igual.
Os pongo la consulta. Acepto todo tipo de sugerencias y opiniones al respecto.
Muchas gracias de antemano.
Código:
SELECT SQL_CACHE curso, titulo, SUM((SELECT CASE WHEN (examenes_aprobados=cantidad_examenes) THEN 1 ELSE 0 END)) AS aprobados, SUM((SELECT CASE WHEN (examenes_aprobados<>cantidad_examenes) THEN 1 ELSE 0 END)) AS suspensos, COUNT(usuario) AS total FROM (SELECT tabla_estado_alumnos.usuario AS usuario, tabla_estado_alumnos.num_test_aprobados_por_curso AS examenes_aprobados, tabla_estado_alumnos.curso AS curso, tabla_examenes_curso.numero_examenes AS cantidad_examenes, tabla_estado_alumnos.test as titulo FROM (SELECT puntuaciones.usr_id as usuario, SUM((SELECT CASE WHEN (puntuaciones.puntuacion >= cursos.cur_porcentaje_aprobacion) THEN 1 ELSE 0 END)) as num_test_aprobados_por_curso, puntuaciones.cur_id as curso, puntuaciones.cur_titulo as test FROM cursos, (SELECT SQL_CACHE resultado.ale_fecha AS Fecha, cursos.cur_id, usuarios.usr_id, cursos.cur_titulo, COUNT(resultado.ale_id) AS Preguntas, COUNT(correctas.evr_id) AS Correctas, (100.0 / COUNT(resultado.ale_id) )* COUNT(correctas.evr_id) AS Puntuacion, usuarios.usp_id FROM alumnos_evaluaciones AS resultado INNER JOIN usuarios ON (usuarios.usr_id = resultado.usr_id) INNER JOIN evaluacion_respuestas AS todas ON (todas.evr_id = resultado.evr_id) INNER JOIN evaluacion_preguntas AS p ON (todas.evp_id = p.evp_id) INNER JOIN items ON (items.itm_id = p.itm_id) INNER JOIN cursos ON (cursos.cur_id = items.cur_id AND cursos.cur_fecha_alta <= NOW() AND ((cursos.cur_fecha_baja IS NULL) OR (cursos.cur_fecha_baja >= NOW() ))) LEFT JOIN evaluacion_respuestas AS correctas ON ( correctas.evr_id = resultado.evr_id AND correctas.evr_correcta = 1 ) where resultado.ale_fecha IN (select MAX(ale_fecha) from alumnos_evaluaciones al where al.usr_id = usuarios.usr_id AND al.cur_id = cursos.cur_id) GROUP BY 1,2) AS puntuaciones, (SELECT lista_items_alumno.usr_id AS id_usuario, lista_items_curso.id_curso AS id_curso FROM (SELECT COUNT(itm_id) AS num_items, cursos.cur_titulo AS titulo, cursos.cur_id AS id_curso FROM items, cursos WHERE (items.cur_id = cursos.cur_id) AND (items.tip_id='evaluacion') GROUP BY cursos.cur_id) AS lista_items_curso, (SELECT items.cur_id, COUNT(alumnos_progreso.itm_id) AS num_items_alumno, alumnos_progreso.usr_id, usuarios.usp_id FROM items, alumnos_progreso, usuarios WHERE (items.tip_id='evaluacion') AND (items.itm_id=alumnos_progreso.itm_id) AND (usuarios.usr_id=alumnos_progreso.usr_id) AND usuarios.usr_baja IS NULL GROUP BY items.cur_id, alumnos_progreso.usr_id, usuarios.usp_id) AS lista_items_alumno WHERE (lista_items_alumno.num_items_alumno = lista_items_curso.num_items) AND (lista_items_curso.id_curso = lista_items_alumno.cur_id) GROUP BY 1,2) AS finalizados WHERE (cursos.cur_id = puntuaciones.cur_id) AND (puntuaciones.cur_id = finalizados.id_curso) AND (puntuaciones.usr_id = finalizados.id_usuario) GROUP BY 1,3) AS tabla_estado_alumnos, (SELECT cursos.cur_id AS curso, COUNT(items.cur_id) AS numero_examenes FROM cursos, items WHERE (cursos.cur_id=items.cur_id) AND (items.tip_id='evaluacion') GROUP BY 1) AS tabla_examenes_curso WHERE (tabla_estado_alumnos.curso=tabla_examenes_curso.curso)) AS tabla_final GROUP BY curso ORDER BY titulo