У меня есть две таблицы:MySQL: сохраненное вызов функции + левое соединение = очень очень медленно
module_339 (id,name,description,etc)
module_339_schedule(id,itemid,datestart,dateend,timestart,timeend,days,recurrent)
module_339_schedule.itemid указывает на module_339
кулак стол проводит конференции
второй один держит графики конференций
module_339 имеет 3 позиции
module_339_schedule имеет 4000+ элементов - почти поровну разделен между 3 конференциями
У меня есть хранимая функция - «getNextDate_module_339» - которая будет вычислять «следующую дату» для указанной конференции, для того, чтобы быть в состоянии отображать его, а также сортировать по нему - если пользователь хочет. Эта хранимая процедура будет просто принимать все записи расписания указанной конференции и прокручивать их, сравнивая даты и время. Таким образом, он сделает одно простое чтение из модуля_339_schedule, затем перебирает элементы и сравнивает даты и время.
Проблема: этот запрос очень медленно:
SELECT
distinct(module_339.id)
,min(getNextDate_module_339(module_339.id,1,false)) AS ND
FROM
module_339
LEFT JOIN module_339_schedule on module_339.id=module_339_schedule.itemid /* standard schedule adding */
WHERE 1=1 AND module_339.is_system_preview<=0
group by
module_339.id
order by
module_339.id asc
Если удалить либо вызов функции ИЛИ LEFT JOIN, это быстро снова. Что я здесь делаю неправильно? Кажется, это какой-то «столкновение» между вызовом функции и левым соединением.
Это ускорит процесс, единственная проблема заключается в том, что этот запрос представляет собой упрощенную версию фактического запроса - это иллюстрирует ошибку - и автоматически генерируется, поэтому мне нужно будет проверить, не влияет ли это на что-либо еще в обработать. Тем не менее, ваш ответ фиксирует пунктуальный вопрос, который я задал. Поэтому я буду отмечать ваш ответ как решение. Спасибо! – Catalin
Забыл сказать: хранимая функция довольно быстро сама по себе, именно в этой комбинации все становится болезненно медленным. – Catalin
рад помочь :-) –