Не используйте картезианское произведение - нечитаемо. Используйте нормальный JOIN-синтаксис:
SELECT `p`.`sum`, `p`.`type`, `p`.`visit`
FROM `visits` AS `v`
JOIN `payments` AS `p` ON `v`.`id` = `p`.`visit`
WHERE DATE(p.date) = '2021-10-04' AND `v`.`office` = '1'
Соответственно для оптимизации запроса требуется:
1. избавиться от функции в условии отбора и конвертировать его в вид
SELECT `p`.`sum`, `p`.`type`, `p`.`visit`
FROM `visits` AS `v`
JOIN `payments` AS `p` ON `v`.`id` = `p`.`visit`
WHERE p.date >= '2021-10-04'
AND p.date < '2021-10-05'
AND `v`.`office` = '1'
2. Создать индексы:
2a.
visits (office, id)
.
2b.
payments (`date`, visit)
и
payments (visit, `date`)
, посмотреть какой из них используется, удалить неиспользуемый.
3. Если поле
`v`.`office` имеет числовой тип, изменить условие отбора по этому полю на
AND `v`.`office` = 1
. В исходном виде, если поле числовое, то и поле, и значение приводятся к floating-point number, и только потом сравниваются.