Na verdade, você não pode otimizar essa consulta.
Você está classificando o resultado usando um valor calculado, portanto, não pode usar um índice. Se você usar
explain
você pode ver como sua consulta está sendo executada e using temporary
estará presente no extra
coluna, o que significa que todos os dados da sua consulta estão sendo armazenados em uma tabela temporária na qual a ordenação é realizada. Não importa se você quer apenas as primeiras 50 correspondências na consulta, ela precisa primeiro obter todos os dados, despejá-los em uma tabela temporária, classificar o resultado nessa tabela e depois retornar para você as primeiras 50 correspondências.
Como você pode supor, esta é uma operação que consome tempo e memória.
Então, sua melhor opção é colocar um índice na tabela para obter todas as linhas que você precisa o mais rápido possível e processá-las com
php
para obter os dados que você precisa. A propósito, dê uma olhada no guia de otimização do MySQL .