Probemos algo diferente. Solo sugiero esto como una "respuesta" debido a su longitud y no puede formatear un comentario. Abordemos la consulta de forma modular como una serie de subconjuntos que deben intersecarse. Veamos cuánto tarda cada uno de estos en ejecutarse (por favor informe). Sustituya sus marcas de tiempo por t1 y t2. Observe cómo cada consulta se basa en la anterior, lo que la convierte en una "vista en línea".
EDITAR:también, confirme las columnas en la tabla 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