GROUP BY y ORDER BY son cláusulas asesinas de performance. Son los procesos que más tiempo consumen, en especial si la cantidad de registros es elevada.
Habría que analizar el funcionamiento con EXPLAIN, para ver dónde se puede mejorar, qué indices se pueden crear, y dónde está consumiendo principalmente los recusos.
Esto sería lo que debes correr desde el phpMyadmin (no lo hagas desde PHP), y mostrarnos el resultado compelto de la tabla:
Código MySQL:
Ver original r1.teoricas
, ((COUNT (r0.dni
) * 100) / r1.teoricas
) porcentaje
, r1.actividad, r4.edad
AND r3.id_act
= $identificacion_curso
AND ( r0.asistencia
= 'presente'