Другая возможность:
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
WHERE up.available_for_survey = 1
AND upz.zip_code_id = 1
AND bjr.user_id IS NULL
AND NOT EXISTS( SELECT 1 FROM book_job_request
WHERE user_id = up.user_id
AND end_time >= 1583821800000
AND start_time <= 1583825400000 )
Рекомендуемые индексы (для моего НЕ СУЩЕСТВУЮЩЕГО и для СТРОБЕРБЕРСКОГО ЛЕВОГО СОЕДИНЕНИЯ):
book_job_request: (user_id, start_time, end_time)
upz: (zip_code_id, utility_pro_id)
up: (available_for_survey, user_id, id)
Указанный порядок столбцов важен. И нет, у вас в данный момент одинаковые индексы не так хороши.