kawabanga
@kawabanga

Как ускорить запрос c ifnull mysql?

Есть приблизительно такой запрос:

select *, ifnull(r.time_pay_for, r.time_update) as sort
from table
order by sort

с сортировкой "order by sort" просаживает запрос в 3 раза, (с 0.02 до 0.06), каким образом, можно упростить добывание сортировки? добавить еще одно поле и по триггеру обновлять его?
  • Вопрос задан
  • 353 просмотра
Решения вопроса 2
suguby
@suguby
программист, python, django, mysql, git, hg, linux
Вычисляемое поле => сортировка всегда будет тормозить. отдельное поле может помочь только если вы делаете на нем индекс и выбираете в селекте поля из индекса.
Вообще, select * - плохой путь, оптимизатор плачет.
Ответ написан
Сортировка по вычисляемому полю будет работать долго априори.
Для того, чтобы ускорить такую сортировку -- сделайте дополнительное поле в таблице, создайте индекс и делайте периодически:
UPDATE table SET srt_field = ifnull(r.time_pay_for, r.time_update);

Вместо периодических апдейтов можно использовать и триггер.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
miraage
@miraage
Старый прогер
Попробуйте COALESCE:

select *, COALESCE(r.time_pay_for, r.time_update) as sort 
from table 
order by sort
Ответ написан
судя по вашему вопросу запрос ускорился более чем в три раза с 0.020 до 0.006, если значение сортировки в выборке не нужен, то можно попробовать так:
select *
from table 
order by ifnull(r.time_pay_for, r.time_update)

время может снизиться, но незначительно
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы