Il existe une solution à ce problème dans MySQL Server 5.6 - la version de prévisualisation (au moment d'écrire ces lignes).
http://dev.mysql.com /doc/refman/5.6/en/from-clause-subquery-optimization.html
Cependant, je ne sais pas si MySQL Optimizer réutilisera les index qui existent déjà lorsqu'il "ajoute des index à la table dérivée"
Considérez la requête suivante :
SELECT * FROM t1JOIN (SELECT * FROM t2) AS derive_t2 ON t1.f1=derived_t2.f1;
La documentation indique :"L'optimiseur construit un index sur la colonne f1 à partir de la dérivation_t2 si cela permet l'utilisation de l'accès aux références pour le plan d'exécution le moins coûteux."
OK, c'est super, mais est-ce que l'optimiseur réutilise les index de t2 ? En d'autres termes, que se passerait-il si un index existait pour t2.f1 ? Cet index est-il réutilisé ou l'optimiseur recrée-t-il cet index pour la table dérivée ? Qui sait ?
MODIF : La meilleure solution jusqu'à MySQL 5.6 est de créer une table temporaire, de créer un index sur cette table, puis d'exécuter la requête SELECT sur la table temporaire.