@optime
usare una tabella derivata per il risultato di una union non riduce i tempi di esecuzione 
codice:
"id";"select_type";"table";"type";"possible_keys";"key";"key_len";"ref";"rows";"Extra"
"1";"PRIMARY";"<derived2>";"system";NULL;NULL;NULL;NULL;"0";"const row not found"
"2";"DERIVED";"a";"ALL";NULL;NULL;NULL;NULL;"1";""
"2";"DERIVED";"b";"ref";"Index 2";"Index 2";"4";"test.a.id";"1";"Using index"
"3";"UNION";"a";"ALL";NULL;NULL;NULL;NULL;"1";""
"3";"UNION";"b";"ref";"Index 3";"Index 3";"4";"test.a.id";"1";"Using index"
NULL;"UNION RESULT";"<union2,3>";"ALL";NULL;NULL;NULL;NULL;NULL;""
scusa la formattazione, ma comunque il concetto vien fuori 
@alfonso534791
il motivo per cui ti ci sta 6 vite è che, almeno dalla explain, non risultano indici usati e quindi deve confrontarsi, per ogni singolo record, tutto il resto della tabella il che mi fa pensare che non ci sono indici nelle tue tabelle :\
se metti delle chiavi, anche semplici, possible_keys ti conterrà qualcosa, ma soprattutto ci starà infinitamente di meno (cosi come anche sql server)