проблематика в том, что первая таблица (visits), где я делаю выборку по office, даёт сразу много результирующих данных.
Не факт. БД mysql умеет исправлять самые грубые ошибки, и вполне может переписать запрос так, чтобы не payments джойнилась к visits, а наоборот - как и должно быть.
(1) индексы на нужных полях есть
(2) у поля p.date индекса нет
Я один здесь вижу взаимоисключающие параграфы?
В общем, добавить индекс на поле date
И поменять запрос, чтобы payments была первой, а вместо date() нужная дата выбиралась через BETWEEN