Использование возвращаемого значения функции для сортировки результатов может быть очень медленным, если вы сортируете большое количество строк, потому что MySQL не может использовать индекс для сортировки этих значений.Итак, как обойти это?
Если элемент ДОЛЖЕН быть на специальном уровне, чтобы быть свободным (что, кажется, имеет место из предоставленного вами макета таблицы), вы можете попробовать:
SELECT *, special_price IS NULL AS not_special
FROM tablename
ORDER BY not_special ASC, special_price ASC, price ASC;
Это добавляет дополнительный столбец к результатам, который равен 0, если элемент находится в специальном, 1, если нет.Затем мы помещаем все «специальные» элементы в верхнюю часть сортировки и сортируем по возрастанию по специальной цене и цене.
Это позволит вам избежать накладных расходов на UNION
, по-прежнему используя индекс для сортировки.и избегайте очень медленных запросов при сортировке большого количества строк с возвращаемым значением функции ... но только если элемент должен быть специальным, чтобы быть свободным.