Всъщност не можете да оптимизирате тази заявка.
Сортирате резултата с помощта на изчислена стойност, така че не можете да използвате индекс. Ако използвате explain
можете да видите как се изпълнява вашата заявка и using temporary
ще присъства в extra
колона, което означава, че всички данни от вашата заявка се съхраняват във временна таблица, в която се извършва подреждането.
Няма значение дали искате само първите 50 съвпадения в заявката, тя трябва първо да получи всички данни, да ги изхвърли във временна таблица, да сортира резултата в тази таблица и след това да ви върне първите 50 съвпадения.
Както можете да предположите, това е отнемаща време и памет операция.
Така че най-добрият вариант е да поставите индекс в таблицата, за да получите всички редове, от които се нуждаете възможно най-бързо и след това да ги обработите с php
за да получите нужните ви данни.
Между другото, разгледайте Ръководство за оптимизиране на MySQL .