Ve skutečnosti tento dotaz nemůžete optimalizovat.
Výsledek třídíte pomocí vypočítané hodnoty, takže nemůžete použít index. Pokud použijete explain
můžete vidět, jak se váš dotaz provádí, a using temporary
bude přítomen v extra
sloupec, což znamená, že všechna data z vašeho dotazu se ukládají do dočasné tabulky, ve které se provádí řazení.
Nezáleží na tom, zda chcete v dotazu pouze prvních 50 shod, musí nejprve získat všechna data, uložit je do dočasné tabulky, seřadit výsledek v této tabulce a poté vám vrátit prvních 50 shod.
Jak můžete předpokládat, je to operace náročná na čas a paměť.
Nejlepší možností je tedy umístit do tabulky index, abyste získali všechny potřebné řádky co nejrychleji, a poté je zpracovat pomocí php
abyste získali data, která potřebujete.
Mimochodem, podívejte se na průvodce optimalizací MySQL .