Vamos tentar algo diferente. Estou apenas sugerindo isso como uma "resposta" por causa de seu tamanho e você não pode formatar um comentário. Vamos abordar a consulta modularmente como uma série de subconjuntos que precisam ser cruzados. Vamos ver quanto tempo leva para executar cada um deles (por favor, informe). Substitua seus timestamps por t1 e t2. Observe como cada consulta se baseia na anterior, tornando a anterior uma "exibição em linha".
EDIT:também, confirme as colunas na tabela Redes.
1
select PM.receiver_id from private_messages PM
where PM.create_at between (t1 and t2)
2
select U.id, U.network_id from users U
join
(
select PM.receiver_id from private_messages PM
where PM.create_at between (t1 and t2)
) as FOO
on U.id = FOO.receiver_id
3
select N.* from networks N
join
(
select U.id, U.network_id from users U
join
(
select PM.receiver_id from private_messages PM
where PM.create_at between (t1 and t2)
) as FOO
on U.id = FOO.receiver_id
) as BAR
on N.id = BAR.network_id