In the end, analyzing the problem comes to the conclusion that if the tables were to be joined, then the query done more quickly, so that it creates a stored procedure to fill a temporary table, so:CREATE PROCEDURE `crear_tabla_liquidaciones_visibles`(IN id_empresa INT, IN anio INT, IN mes INT, IN quincena INT)
BEGIN
DROP TEMPORARY TABLE IF EXISTS tmp_liquidaciones_visibles;
CREATE TEMPORARY TABLE IF NOT EXISTS tmp_liquidaciones_visibles ENGINE=MEMORY
SELECT lt.id_detalle_liquidacion AS id_detalle_liquidacion,
lt.cod_concepto AS cod_concepto,
lt.columna AS columna,
lt.concepto AS concepto,
lt.valor AS valor,
lt.cantidad AS cantidad,
lt.comentario AS comentario,
lt.id_liquidacion AS id_liquidacion,
lt.id_empleado AS id_empleado,
lt.id_periodo_liquidado AS id_periodo_liquidado,
lt.id_empresa AS id_empresa,
lt.quincena AS quincena,
lt.anio AS anio,
lt.mes AS mes,
lt.no_remunerativo AS no_remunerativo,
lt.no_imponible_9 AS no_imponible_9,
lt.id_sobre AS id_sobre,
0 AS guardada
FROM Liquidaciones_temporales lt
WHERE lt.anio = anio
AND (lt.mes = mes OR mes = -1)
AND (lt.quincena = quincena OR quincena = -1)
AND lt.id_empresa = id_empresa;
INSERT INTO tmp_liquidaciones_visibles
SELECT lg.id_detalle_liquidacion AS id_detalle_liquidacion,
lg.cod_concepto AS cod_concepto,
lg.columna AS columna,
lg.concepto AS concepto,
lg.valor AS valor,
lg.cantidad AS cantidad,
lg.comentario AS comentario,
lg.id_liquidacion AS id_liquidacion,
lg.id_empleado AS id_empleado,
lg.id_periodo_liquidado AS id_periodo_liquidado,
lg.id_empresa AS id_empresa,
lg.quincena AS quincena,
lg.anio AS anio,
lg.mes AS mes,
lg.no_remunerativo AS no_remunerativo,
lg.no_imponible_9 AS no_imponible_9,
lg.id_sobre AS id_sobre,
1 AS guardada
FROM Liquidaciones_guardadas lg
WHERE lg.anio = anio
AND (lg.mes = mes OR mes = -1)
AND (lg.quincena = quincena OR quincena= -1)
AND lg.id_empresa = id_empresa
AND NOT EXISTS( SELECT 1
FROM Liquidaciones_temporales lt2
WHERE lt2.anio= anio
AND (lt2.mes= mes OR mes = -1)
AND (lt2.quincena= quincena OR quincena = -1)
AND lt2.id_empresa= id_empresa
AND lt2.id_sobre = lg.id_sobre
AND lt2.mes = lg.mes
AND lt2.anio = lg.anio
AND lt2.quincena = lg.quincena
AND lt2.id_empresa = lg.id_empresa
AND lt2.id_empleado = lg.id_empleado);
END
The theme is that wheres are parameterized to the views, so that it only works with the assemblies after being filtered, which is much faster than joining the tables and then filtering them.In conclusion: I think the best way to fix it would be if you could parameterize the views, but mysql doesn't allow it any more with some workaround as you see in https://stackoverflow.com/questions/2281890/can-i-create-view-with-parameter-in-mysql .