2014-10-16 2 views
2

У меня есть запрос, который выглядит как этотMySql же расчет в выбрать и где

SELECT 
    col1, 
    col2 
FROM 
    table1 t1 
    INNER JOIN table2 t2 
    ON t1.col = t2.col 
WHERE expensive_func() < 10 

Это работает довольно быстро @ 0.110 секунд. Но если я хочу также показать результат expensive_func() так изменить запрос

SELECT 
    col1, 
    col2, 
    expensive_func() as col3 
FROM 
    table1 t1 
    INNER JOIN table2 t2 
    ON t1.col = t2.col 
WHERE expensive_func() < 10 

Это работает, но время запроса теперь ~ 0,550

использованием объяснить на возвращает оба запрос, в точности то же самое (подтверждено дифф)

Есть ли способ использовать дорогой func?

Я предполагаю, что он медленнее, потому что он должен хранить результат дорогого func? как его более чем в два раза медленнее (то, что я ожидал бы быть максимум)

EDIT:

Только в случае, если версия 5.5.37-0ubuntu0.12.04.1-журнал, что я использую.

Edit2:

Удаление expensive_func() из WHERE не кажется, делают различие во втором запросе в терминах времени, она возвращает несколько строк, но в то же количество времени.

Edit3:

По какой-то причине, используя MySQL CREATE FUNCTION замедляет его, принимая код из функции и положить его в запросе делает его гораздо быстрее.

+0

Что делает 'дорогой_func()' для? Попробуйте создать простой UDF, например, вернуть константу, а затем снова проверить. –

+0

Расчет расстояния – exussum

ответ

0

expensive_func был сохраненной функцией. Замена сохраненной функции содержимым хранимой функции заставляет запрос работать в ~ 0.080 секунд. огромное улучшение.

Я не уверен, почему хранящаяся функция сделала все гораздо медленнее, но, похоже, единственный недостаток - это немного менее ремонтируемый код MySQL.

Смежные вопросы