Essayons quelque chose de différent. Je ne fais que suggérer cela comme une "réponse" en raison de sa longueur et vous ne pouvez pas formater un commentaire. Abordons la requête de manière modulaire comme une série de sous-ensembles qui doivent être intersectés. Voyons combien de temps il faut à chacun de ces éléments pour s'exécuter (veuillez signaler). Remplacez vos horodatages par t1 et t2. Notez comment chaque requête s'appuie sur la précédente, faisant de la précédente une "vue intégrée".
EDIT :veuillez également confirmer les colonnes du tableau Réseaux.
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