Det finns en lösning på detta i MySQL Server 5.6 - förhandsversionen (när detta skrivs).
http://dev.mysql.com /doc/refman/5.6/en/from-clause-subquery-optimization.html
Även om jag inte är säker på om MySQL Optimizer kommer att återanvända index som redan finns när den "lägger till index till den härledda tabellen"
Tänk på följande fråga:
VÄLJ * FRÅN t1JOIN (VÄLJ * FRÅN t2) SOM derived_t2 ON t1.f1=derived_t2.f1;
Dokumentationen säger:"Optimeraren konstruerar ett index över kolumn f1 från derived_t2 om det skulle tillåta användningen av ref-åtkomst för den lägsta kostnadsutförandeplanen."
OK, det är bra, men återanvänder optimeraren index från t2? Med andra ord, tänk om det fanns ett index för t2.f1? Återanvänds detta index, eller återskapar optimeraren detta index för den härledda tabellen? Vem vet?
EDIT: Den bästa lösningen fram till MySQL 5.6 är att skapa en temporär tabell, skapa ett index på den tabellen och sedan köra SELECT-frågan på den tillfälliga tabellen.