Du kan faktiskt inte optimera den frågan.
Du sorterar resultatet med ett beräknat värde, så du kan inte använda ett index. Om du använder explain
du kan se hur din fråga exekveras och using temporary
kommer att finnas i extra
kolumn, vilket innebär att all data från din fråga lagras i en temporär tabell där beställningen utförs.
Det spelar ingen roll om du bara vill ha de första 50 matchningarna i frågan, den måste först hämta all data, dumpa den i en tillfällig tabell, sortera resultatet i den tabellen och sedan returnera de första 50 matchningarna till dig.
Som du kan ana är detta en tids- och minneskrävande operation.
Så det bästa alternativet är att placera ett index i tabellen för att få alla rader du behöver så snabbt du kan och sedan bearbeta dem med php
för att få den information du behöver.
Förresten, ta en titt på MySQL-optimeringsguide .