Я пытался выяснить, что не так с набором полученных мной запросов, и сейчас я просто сбит с толку.
Предполагается, что это хранимая процедура, которая вызывается приложением с графическим интерфейсом пользователя.
Есть только одна «крошечная» проблема: сначала простое UPDATE
, затем INSERT
с использованием SELECT
с подзапросом и, наконец, еще одно ОБНОВЛЕНИЕ
. Выполняя эти запросы вместе вручную, я получаю общее время выполнения 0,057 с, не так уж и плохо.
Теперь я пытаюсь создать хранимую процедуру с этими запросами в ней и пятью входными переменными, я запускаю эту процедуру, и с первой попытки она заняла 47,096 с, а последующие вызовы к ней показали аналогичное время выполнения (от 35 до 50 с). Выполнение отдельных запросов из MySQL Workbench по-прежнему показывает время выполнения меньше 0.1s
В этих запросах действительно нет ничего особенного, так почему же хранимая процедура занимает вечность на выполнение, в то время как запросы сами по себе занимают лишь долю секунды? Есть ли какая-то особенность MySQL, которую мне здесь не хватает?
Дополнительные результаты тестирования:
Кажется, что если я запускаю запросы в MySQL Workbench, но использую переменные вместо того, чтобы просто помещать значения переменных в запросы он работает так же медленно, как и хранимая процедура. Поэтому я попытался изменить хранимую процедуру, чтобы использовать статические значения вместо переменных, и внезапно она заработала невероятно быстро. По-видимому, по какой-то причине использование переменной делает его чрезвычайно медленным (например, первый запрос UPDATE
занимает примерно 0,98 с с тремя переменными до 0,04–0,05 с, когда я использую значения переменных непосредственно в query, независимо от того, находится ли он в хранимой процедуре или выполняет запрос напрямую).
Итак, проблема не в хранимой процедуре, а в том, что я использую переменные (что неизбежно).