En realidad, no puede optimizar esa consulta.
Está ordenando el resultado usando un valor calculado, por lo que no puede usar un índice. Si usa explain
podría ver cómo se ejecuta su consulta y using temporary
estará presente en el extra
columna, lo que significa que todos los datos de su consulta se almacenan en una tabla temporal en la que se realiza el pedido.
No importa si solo desea las primeras 50 coincidencias en la consulta, primero tiene que obtener todos los datos, volcarlos en una tabla temporal, ordenar el resultado en esa tabla y luego devolverle las primeras 50 coincidencias.
Como puede suponer, esta es una operación que consume tiempo y memoria.
Entonces, su mejor opción es colocar un índice en la tabla para obtener todas las filas que necesita lo más rápido posible y luego procesarlas con php
para obtener los datos que necesita.
Por cierto, echa un vistazo a la Guía de optimización de MySQL .