Non hai da nessuna parte vicino al limite di JOIN per MySQL. Il tuo numero di join non è male. Tuttavia, l'unione in una tabella derivata (la tua sottoquery interna) come stai facendo può causare problemi di prestazioni, poiché le tabelle derivate non hanno indici. L'esecuzione di un join su una tabella derivata senza indici può essere lenta.
Dovresti considerare di creare una vera tabella temporanea con indici per unirti o trovare un modo per evitare la sottoquery.
Un JOIN in MySQL è fondamentalmente come fare una ricerca (ricerca) per ogni riga unita. Quindi, MySQL dovrà eseguire molte ricerche se stai unendo molti record. Può essere un problema meno il numero di tabelle a cui ti unisci che il numero di righe a cui ti unisci.
Ad ogni modo, MySQL eseguirà solo così tante ricerche prima di arrendersi e leggere l'intera tabella. Fa un ottimo lavoro nel decidere quale sarà meno costoso.
Forse la cosa migliore che puoi fare è aiutarlo a indovinare aggiornando le statistiche dell'indice con ANALYZE TABLE.
Puoi avere una clausola WHERE per SELECT. Quindi la tua subquery interna avrà una clausola WHERE e la tua query esterna avrà una clausola WHERE, e queste verranno applicate dopo il JOIN (almeno logicamente, sebbene MySQL le applichi generalmente prima per le prestazioni).
Inoltre, tutto questo presuppone che tu sappia come utilizzare correttamente gli indici.