Utilizamos moodle 1.9.4 y myslq 5.0.x con innodb como backend. Estamos muy contentos con el rendimiento de nuestra instalación.
La excepción a la regla la constituyen las estadísticas... son extremadamente lentas. Que sea lento no nos preocupa. Nos preocupa más el empeoramiento del tiempo de respuesta que se produce debido a la contención en algunas filas de tablas como mdl_course (profesor que edita curso cuando hay un lock de lectura sobre la fila de su curso, por ejemplo) cuando las estadísticas están en marcha.
¿Cómo estáis abordando este problema?
He estado revisando el código de estadísticas y creo que reescribiendo algunas queries de forma adecuada se puede mejorar sustancialmente el rendimiento de este subsistema. Si bien, no tengo nada presentable todavía. Por ejemplo, un query que tardaba del orden de 300 segundos he conseguido reducir su tiempo de ejecución a menos de 1 segundo haciendo un sencillo cambio [1] (siempre mysql...). Esto me hace pensar que, tal vez, invirtiendo algo de tiempo en reescribir algunas queries y precalcular algunos resultados podríamos mejorar mucho el tiempo de ejecución y sus efectos colaterales.
Antes de proponer algo en el tracker (hay varios reports y discusiones al respecto por ahí), quería ver qué pensabais por aquí del problema y cómo los estáis abordando.
Un saludo a tod@s.
------
[1] Simplificando. El código que utiliza para calcular enrolments (sin considerar asignaciones de rol a nivel de categoría):
SELECT DISTINCT ra.roleid, ra.userid, c.id as courseid
FROM mdl_role_assignments ra JOIN mdl_context ctx
ON ctx.id = ra.contextid
CROSS JOIN mdl_course c
JOIN mdl_role_capabilities rc
ON rc.roleid = ra.roleid
WHERE ((rc.capability = 'moodle/course:view' )
AND rc.permission = 1 AND rc.contextid = 2
AND (ctx.contextlevel = 10
OR (c.id = ctx.instanceid AND ctx.contextlevel = 50)))
Se ejecuta infinitamente más rápido (en mysql) si lo reescribimos por:
SELECT ra.roleid, ra.userid, c.id as courseid
FROM mdl_role_assignments ra JOIN mdl_context ctx
ON ctx.id = ra.contextid
CROSS JOIN mdl_course c
JOIN mdl_role_capabilities rc
ON rc.roleid = ra.roleid
WHERE (rc.capability = 'moodle/course:view' )
AND rc.permission = 1 AND rc.contextid = 2
AND (ctx.contextlevel = 10)
UNION
SELECT DISTINCT ra.roleid, ra.userid, c.id as courseid
FROM mdl_role_assignments ra JOIN mdl_context ctx
ON ctx.id = ra.contextid
CROSS JOIN mdl_course c
JOIN mdl_role_capabilities rc
ON rc.roleid = ra.roleid
WHERE (rc.capability = 'moodle/course:view' )
AND rc.permission = 1 AND rc.contextid = 2 AND
c.id = ctx.instanceid AND ctx.contextlevel = 50;