Оптимизируйте MySQL-запрос, чтобы избежать ненужных вызовов пользовательских функций. - PullRequest
2 голосов
/ 17 марта 2010

У меня есть запрос, который делает несколько вызовов в инструкции SELECT для определенной пользователем функции. Функция (vfget) возвращает значение обратно из пар ключ = значение, содержащихся в строке.

Возможно ли, чтобы запрос просто вызывал функцию один раз и сохранял ее в переменной, чтобы ее можно было повторно использовать в том же запросе?

В настоящее время мой запрос:

SELECT 
        CASE WHEN(right(vfget(appmod_params, 'service'), 3) = '_dd' OR right(vfget(appmod_params, 'service'), 3) = '_wp')
            THEN left(vfget(appmod_params, 'service'), length(vfget(appmod_params, 'service'))-3)
            ELSE vfget(appmod_params, 'service')
        END
FROM ota1003
LIMIT 10

1 Ответ

2 голосов
/ 17 марта 2010
SELECT  @vf := vfget(appmod_params, 'service'),
        case when right(@vf, 3) IN ('_dd', '_wp')
            then left(@vf, length(@vf) - 3)
            else @vf
        end
from ota1003
limit 10

или это:

SELECT  case when right(vf, 3) IN ('_dd', '_wp')
            then left(vf, length(vf) - 3)
            else vf
        end
FROM    (
        SELECT  vfget(appmod_params, 'service') AS vf
        FROM    ota1003
        LIMIT 10
        ) q

Вложенные запросы в MySQL буферизуются и, следовательно, менее эффективны, хотя при наличии только 10 записей это не должно быть большой проблемой.

...