En fait, vous ne pouvez pas optimiser cette requête.
Vous triez le résultat à l'aide d'une valeur calculée, vous ne pouvez donc pas utiliser d'index. Si vous utilisez explain
vous pouvez voir comment votre requête est exécutée et using temporary
sera présent dans le extra
colonne, ce qui signifie que toutes les données de votre requête sont stockées sur une table temporaire dans laquelle le classement est effectué.
Peu importe si vous ne voulez que les 50 premières correspondances dans la requête, il faut d'abord obtenir toutes les données, les vider dans une table temporaire, trier le résultat dans cette table, puis vous renvoyer les 50 premières correspondances.
Comme vous pouvez le supposer, il s'agit d'une opération consommatrice de temps et de mémoire.
Donc, votre meilleure option est de placer un index dans la table pour obtenir toutes les lignes dont vous avez besoin aussi vite que possible, puis de les traiter avec php
pour obtenir les données dont vous avez besoin.
Au fait, jetez un œil au Guide d'optimisation MySQL .