Существует замечательная подробная статья о таком профилировании: http://mablomy.blogspot.com/2015/03/profiling-stored-procedures-in-mysql-57.html
Начиная с MySQL 5.7, вы можете использовать performance_schema
для получения информации о продолжительности каждого оператора в хранимой процедуре.Просто:
1) Активируйте профилирование (используйте «NO», если хотите отключить его)
UPDATE performance_schema.setup_consumers SET ENABLED="YES"
WHERE NAME = "events_statements_history_long";
2) Запустите процедуру
CALL test('with parameters', '{"if": "needed"}');
3) Запросите схему производительности, чтобы получить общую информацию о событии
SELECT event_id,sql_text,
CONCAT(TIMER_WAIT/1000000000,"ms") AS time
FROM performance_schema.events_statements_history_long
WHERE event_name="statement/sql/call_procedure";
|event_id |sql_text |время |
| 2432 |CALL test (...) |1726.4098ms |
4) Получить подробную информацию о событии, которое вы хотите профилировать
SELECT EVENT_NAME, SQL_TEXT,
CONCAT(TIMER_WAIT/1000000000,"ms") AS time
FROM performance_schema.events_statements_history_long
WHERE nesting_event_id=2432 ORDER BY event_id;
|EVENT_NAME |SQL_TEXT |время |
|заявление / sp / stmt |... 1 запрос процедуры ... |4.6718мс |
|заявление / sp / stmt |... еще один запрос процедуры ... |4.6718мс |
|заявление / sp / stmt |... еще один ... ... |4.6718ms |
Таким образом, вы можете сказать, какой запрос занимает больше всего времени в вашем вызове процедуры.
Я не знаю ни одного инструмента, который превратил бы этот набор результатов в KCachegrindдружественный файл или около того.
Обратите внимание, что его не следует активировать на производственном сервере (это может быть связано с проблемой производительности, увеличением размера данных, и, поскольку performance_schema
. events_statements_history_long
содержит значения параметров процедуры, тогда онможет быть проблема безопасности [если параметром процедуры является, например, конечный адрес электронной почты пользователя или пароль])