Проблемы с производительностью процедур в MySQL
Добавлено: Вс 16 окт 2011 09:29
Первоначально данное обсуждение шло через форму обратной связи с сайта. Думаю, ему самое место в этом новом разделе.
JayDi, 09.10.2011:
Dmitry, Devart Team (Ticket ID: 33169), 14.10.2011:
JayDi, 14.10.2011:
JayDi, 09.10.2011:
При работе с процедурами и функциями сервера MySQL имеются существенные проблемы с производительностью. А именно -- с выборкой информации о них (из таблицы mysql.proc).
Из-за дополнительного условия LOWER(db) = xxx не используются стандартный индекс, и серверу приходится обходить всю таблицу целиком. Это оказывает заметное влияние и нагрузку на сервер при большой количестве используемых процедур и функций.
План запроса для вашей версии:
Если же убрать данное условия (например, получать актуальное имя базы данных из свойств подключения), то запрос будет выполняться значительно быстрее с использованием стандартного индекса:
Dmitry, Devart Team (Ticket ID: 33169), 14.10.2011:
Мы не можем убрать условие LOWER(db), так как MySQL сервера на различных операционных системах по разному реагируют на чувствительность к регистру имени базы данных. В Windows OC имена не чувствительны к регистру, в то время как в Linux ОС - чувствительны.
Также пользователь может выполнять хранимую процедуру из другой базы данных, и в таком случае получать оригинальное имя для каждой базы только уменьшит производительность.
JayDi, 14.10.2011:
Есть множество путей решения данной проблемы. Например, запрашивать текст процедуры в 2 подхода. При первом подходе ищем процедуру с оригинальным именем базы и с использованием индекса. А если не находим -- делаем вторую попытку с измененным именем базы.
Еще раз обращаю внимание на катастрофическую скорость работы данного кода -- производительность падает в десятки и сотни раз!
Вот результаты профилировщика производительности, который показывает сколько времени потратилось на выполнение той или иной операции (версия MySQL 5.0.67, в базах 1500+ процедур):
1. Подготовка занимает в 28 раз больше времени, чем сам запрос (получение множества значений):
2. Подготовка занимает в 115 раз больше времени, чем сам запрос (получение одного значения):
Естественно, что и сам сервер вместе с утилитами по наблюдению за его работой также начинают ругаться проблемы в запросах к системным таблицам, генерируемые вашими компонентами (большая нагрузка и неоптимальное использование индексов).