Всем привет, подскажите новичку Есть такой запрос: Код (Text): select item_id, ( POW((l0 - 0.101), 2) + POW((l1 - 0.101), 2) + POW((l2 - 0.101), 2) + POW((l3 - 0.101), 2) + POW((l4 - 0.101), 2) + POW((l5 - 0.101), 2) ) as similarity, p.filename as filename, p.path as path from item_descriptions join item p on p.id = item_descriptions.item_id where item_id <> 1 and user_id is null order by similarity asc limit 100 математика считается и присваивается псевдониму similarity в последствии по этому полю производится сортировка, на 1 миллионе записей обработка 1.5 минуты, что "долго" так как база еще продолжает расти, будет еще медленней Всю голову себе сломал, как ускорить 1) сортировка по float наверно не самое быстрое, менял на int не много быстрей но не значительно 2) даже звучит бредово, индекс же не навесить на псевдоним Если убрать order by similarity asc отрабатывает за доли секунды, но мне кажется прирост скорости из за того что указан limit Был бы рад любой помощи/совету
@nekit44, быть может, выгоднее вычисляемые значения хранить в связанной таблице, чтобы не выполнять много-много возведений в степень? То есть, при создании/обновлении записи с полями l1, l2 и т.д. - сразу вычислять и сохранять подобные pow(lx-0.101, 2) значения и уже по ним сортировать...
рад бы хранить это в отдельных столбцах но для каждой строки нужна математика, если сохранить в поле то нарушается бизнес логика если сильно утрировать то будет расчет только одной строки корректный а остальные нет, получается на каждую такую строку в геометрической прогрессии нужно хранить каждый расчет каждой строки
Может кому пригодится решил я проблему Код (Text): with withTable as ( select item_id, ( POW((l0 - 0.101), 2) + POW((l1 - 0.101), 2) + POW((l2 - 0.101), 2) + POW((l3 - 0.101), 2) + POW((l4 - 0.101), 2) + POW((l5 - 0.101), 2) ) as similarity from table_name ) select item_id, similarity from withTable where similarity < 0.3 limit 20 запрос отрабатывает за 1 секунду, что до этого занимало 1.5 минуты