Eh bien, la doc donne les raisons exactes pour lesquelles "Utilisation temporaire" apparaît :
Des tables temporaires peuvent être créées dans des conditions telles que :
S'il existe une clause ORDER BY et une clause GROUP BY différente, ou si ORDER BY ou GROUP BY contient des colonnes de tables autres que la première table de la file d'attente de jointure, une table temporaire est créée.
DISTINCT combiné avec ORDER BY peut nécessiter une table temporaire.
Si vous utilisez l'option SQL_SMALL_RESULT, MySQL utilise une table temporaire en mémoire, à moins que la requête ne contienne également des éléments (décrits plus loin) qui nécessitent un stockage sur disque.
Une analyse rapide montre que vous souffrez de #1.
Et ce blog de 2009 indique que "utiliser filesort" signifie que le tri ne peut pas être effectué avec un index. Puisque vous commandez par un champ calculé, cela sera également vrai.
Donc, c'est ce qui "n'est pas correct".