Proviamo qualcosa di diverso. Sto solo suggerendo questo come una "risposta" a causa della sua lunghezza e non è possibile formattare un commento. Affrontiamo la query in modo modulare come una serie di sottoinsiemi che devono essere intersecati. Vediamo quanto tempo impiega ciascuno di questi per l'esecuzione (si prega di segnalare). Sostituisci i tuoi timestamp con t1 e t2. Nota come ogni query si basa su quella precedente, rendendo la precedente una "vista in linea".
EDIT:conferma anche le colonne nella tabella Reti.
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