Это я знаю, но если записей много, а ограничение слабое (например, по первой букве), то записей под условие попадает очень много. Например, запрос с SORT BY LENGTH выполняется за 50 ms, а с LIMIT без сортировки меньше чем за 1 ms.
А почему бы вам не вынести результат функции LENGTH(str) в отдельную колонку и заносить в неё значение непосредственно при вставке записи? Зачем считать LENGTH при каждом запросе то?
Если критичен именно этот запрос — пара дополнительных полей firstLetter & strLength и составной индекс по ним решат вопрос. Для сопровождения актуальности — пару триггеров.
MySQL вроде как не поддерживает ни индексов по функции, ни вычисляемых столбцов, ни индексируемых представлений, потому да, только добавлять поле в таблицу.
И индексировать надо именно пару (строка, длинна). Это важно. И именно в такой последовательности, она тут тоже важна
если этот самый limit ограничивает выборку достаточно сильно, почему бы не сделать select… from (select… from… order by length(str) limit N) where str line '%a'