consulta interna:
select up.user_id, up.id as utility_pro_id from utility_pro as up
join utility_pro_zip_code as upz ON upz.utility_pro_id = up.id and upz.zip_code_id=1
where up.available_for_survey=1 and up.user_id not in (select bjr.user_id from book_job_request as bjr where
((1583821800000 between bjr.start_time and bjr.end_time) and (1583825400000 between bjr.start_time and bjr.end_time)))
Dividido em duas consultas:
select up.user_id, up.id as utility_pro_id from utility_pro as up join utility_pro_zip_code as upz ON upz.utility_pro_id = up.id and upz.zip_code_id=1
Select bjr.user_id as userId from book_job_request as bjr where bjr.user_id in :userIds and (:startTime between bjr.start_time and bjr.end_time) and (:endTime between bjr.start_time and bjr.end_time)
Nota : De acordo com o meu entendimento, quando única consulta será executada utilizando consulta interna fará a varredura de todos os dados de book_job_request mas ao usar linhas múltiplas consultas com IDs de usuário especificadas serão verificados.
Qualquer outra opção melhor para a mesma operação que não estes dois também é apreciado.
Espero que a consulta é suposto ser mais parecido com isto:
SELECT up.user_id
, up.id utility_pro_id
FROM utility_pro up
JOIN utility_pro_zip_code upz
ON upz.utility_pro_id = up.id
LEFT
JOIN book_job_request bjr
ON bjr.user_id = up.user_id
AND bjr.end_time >= 1583821800000
AND bjr.start_time <= 1583825400000
WHERE up.available_for_survey = 1
AND upz.zip_code_id = 1
AND bjr.user_id IS NULL
Para obter mais ajuda com a otimização (ou seja, quais índices para fornecer) Precisaríamos SHOW CREATE TABLE para todas as tabelas relevantes, bem como a EXPLICAR para o acima