Na primeira consulta o mysql deve selecionar um subconjunto de
mdl_enrol
tabela e completo mdl_user_enrolments
e mdl_userdata
na memória. Então você seleciona muitos dados na memória. Depois de fazer isso - você junta os dados. Se não houver memória suficiente para colocar todos os dados até que sejam unidos e enviados de volta ao cliente - então é criada uma tabela temporária no disco rígido. Muito provavelmente o otimizador mysql não é legal o suficiente para corrigir seu erro e tentar melhorar o plano de execução. Por isso é lento. Considerando que para a segunda consulta o mysql sabe exatamente o que precisa selecionar e seleciona apenas a pequena quantidade de dados necessários. Neste cenário é possível usar índices (assumindo que todos os índices necessários foram criados). Então é rápido.