Existe uma solução para isso no MySQL Server 5.6 - a versão de visualização (no momento da redação deste artigo).
http://dev.mysql.com /doc/refman/5.6/en/from-clause-subquery-optimization.html
Embora não tenha certeza se o MySQL Optimizer reutilizará índices que já existem quando "adicionar índices à tabela derivada"
Considere a seguinte consulta:
SELECT * FROM t1JOIN (SELECT * FROM t2) AS derivado_t2 ON t1.f1=derived_t2.f1;
A documentação diz:"O otimizador constrói um índice sobre a coluna f1 de derivada_t2 se isso permitir o uso de acesso ref para o plano de execução de menor custo."
OK, isso é ótimo, mas o otimizador reutiliza índices de t2? Em outras palavras, e se existisse um índice para t2.f1? Esse índice é reutilizado ou o otimizador recria esse índice para a tabela derivada? Quem sabe?
EDITAR: A melhor solução até o MySQL 5.6 é criar uma tabela temporária, criar um índice nessa tabela e então executar a consulta SELECT na tabela temporária.