Убедитесь, что есть индекс для payments(client_id)
или, что еще лучше, payments(client_id, created_at
).
Для альтернативного способа написания запроса вы можете попробовать not exists
, например:
select *
from clients c
where not exists
(
select *
from payments p
where p.payments.client_id = clients.id
and payments.created_at > utc_timestamp() - interval 90 day
)
Или эксклюзивное левое соединение:
select *
from clients c
left join
payments p
on p.payments.client_id = clients.id
and payments.created_at > utc_timestamp() - interval 90 day
where p.client_id is null
Если оба они медленные, добавьте вывод explain extended
к своему вопросу, чтобы мы могли понять, почему.