Właściwie nie możesz zoptymalizować tego zapytania.
Sortujesz wynik przy użyciu obliczonej wartości, więc nie możesz użyć indeksu. Jeśli używasz explain
możesz zobaczyć, jak Twoje zapytanie jest wykonywane i using temporary
będzie obecny w extra
kolumna, co oznacza, że wszystkie dane z zapytania są przechowywane w tabeli tymczasowej, w której odbywa się porządkowanie.
Nie ma znaczenia, czy chcesz tylko pierwszych 50 dopasowań w zapytaniu, najpierw musisz pobrać wszystkie dane, zrzucić je do tabeli tymczasowej, posortować wyniki w tej tabeli, a następnie zwrócić ci pierwsze 50 dopasowań.
Jak można przypuszczać, jest to operacja czasochłonna i pochłaniająca pamięć.
Więc najlepszą opcją jest umieszczenie indeksu w tabeli, aby pobrać wszystkie potrzebne wiersze tak szybko, jak to możliwe, a następnie przetworzyć je za pomocą php
aby uzyskać potrzebne dane.
Przy okazji, spójrz na przewodnik po optymalizacji MySQL .