Мне кажется проблема здесь в использовании переменных @first_start_time, @second_start_time . Если в запросе используются переменные, то его результаты не кешируются на уровне MySQL. Если во вложенном запросе нет никаких условий, связывающих его с внешним запросом, то результат его выполнения кешируется, иначе вычисляется для каждой строки заново.
Ну и почти любой подзапрос можно переписать в виде JOIN, только даст ли это выигрыш по производительности. Ибо мне кажется затык в переменных.
Подзапрос можно убрать так
from
...
join Event as FirstEvent
on FirstEvent.place_id = g.place_id
where
..
and FirstEvent.event_id = @first_event