25.19.1 Профилирование запросов с помощью Performance Schema
Следующий пример демонстрирует, как использовать события Performance Schema для заявлений и этапов, чтобы получить данные, сопоставимые с информацией о профилировании, предоставляемой командами SHOW
PROFILES и SHOW
PROFILE.
Таблица setup_actors может использоваться для ограничения сбора исторических событий по хосту, пользователю или учетной записи, чтобы уменьшить накладные расходы во время выполнения и объем данных, собираемых в таблицах истории. Первый шаг примера демонстрирует, как ограничить сбор исторических событий определённым пользователем.
Performance Schema отображает информацию о таймерах событий в пикосекундах (триллионных долях секунды), чтобы нормализовать данные о времени к единице измерения. В следующем примере значения TIMER_WAIT делятся на 1000000000000, чтобы отобразить данные в единицах секунд. Значения также усекаются до 6 десятичных знаков, чтобы отобразить данные в том же формате, что и команды SHOW PROFILES и SHOW PROFILE.
-
Ограничьте сбор исторических событий пользователем, выполняющим запрос. По умолчанию,
setup_actorsнастроена для мониторинга и сбора исторических событий для всех фоновых потоков:mysql>
SELECT * FROM performance_schema.setup_actors;+------+------+------+---------+---------+ | HOST | USER | ROLE | ENABLED | HISTORY | +------+------+------+---------+---------+ | % | % | % | YES | YES | +------+------+------+---------+---------+Обновите строку по умолчанию в таблице
setup_actors, чтобы отключить сбор и мониторинг исторических событий для всех фоновых потоков, и вставьте новую строку, которая включит мониторинг и сбор исторических событий для пользователя, выполняющего запрос:mysql>
UPDATE performance_schema.setup_actorsSET ENABLED = 'NO', HISTORY = 'NO'WHERE HOST = '%' AND USER = '%';mysql>INSERT INTO performance_schema.setup_actors(HOST,USER,ROLE,ENABLED,HISTORY)VALUES('localhost','test_user','%','YES','YES');Данные в таблице
setup_actorsтеперь должны быть похожи на следующие:mysql>
SELECT * FROM performance_schema.setup_actors;+-----------+-----------+------+---------+---------+ | HOST | USER | ROLE | ENABLED | HISTORY | +-----------+-----------+------+---------+---------+ | % | % | % | NO | NO | | localhost | test_user | % | YES | YES | +-----------+-----------+------+---------+---------+ -
Убедитесь, что инструментация заявлений и этапов включена, обновив таблицу
setup_instruments. Некоторые инструменты могут быть включены по умолчанию.mysql>
UPDATE performance_schema.setup_instrumentsSET ENABLED = 'YES', TIMED = 'YES'WHERE NAME LIKE '%statement/%';mysql>UPDATE performance_schema.setup_instrumentsSET ENABLED = 'YES', TIMED = 'YES'WHERE NAME LIKE '%stage/%'; -
Убедитесь, что потребители
events_statements_*иevents_stages_*включены. Некоторые потребители могут быть включены по умолчанию.mysql>
UPDATE performance_schema.setup_consumersSET ENABLED = 'YES'WHERE NAME LIKE '%events_statements_%';mysql>UPDATE performance_schema.setup_consumersSET ENABLED = 'YES'WHERE NAME LIKE '%events_stages_%'; -
Под учетной записью пользователя, за которым вы следите, запустите оператор, который хотите профилировать. Например:
mysql>
SELECT * FROM employees.employees WHERE emp_no = 10001;+--------+------------+------------+-----------+--------+------------+ | emp_no | birth_date | first_name | last_name | gender | hire_date | +--------+------------+------------+-----------+--------+------------+ | 10001 | 1953-09-02 | Georgi | Facello | M | 1986-06-26 | +--------+------------+------------+-----------+--------+------------+ -
Определите
EVENT_IDоператора, запросив таблицуevents_statements_history_long. Этот шаг аналогичен запускуSHOW PROFILESдля определенияQuery_ID. Следующий запрос даст результат, аналогичныйSHOW PROFILES:mysql>
SELECT EVENT_ID, TRUNCATE(TIMER_WAIT/1000000000000,6) as Duration, SQL_TEXT FROM performance_schema.events_statements_history_long WHERE SQL_TEXT like '%10001%';+----------+----------+--------------------------------------------------------+ | event_id | duration | sql_text | +----------+----------+--------------------------------------------------------+ | 31 | 0.028310 | SELECT * FROM employees.employees WHERE emp_no = 10001 | +----------+----------+--------------------------------------------------------+ -
Запросите таблицу
events_stages_history_long, чтобы получить события этапов оператора. Этапы связаны с операторами с помощью вложенности событий. Каждая запись события этапа имеет столбецNESTING_EVENT_ID, который содержитEVENT_IDродительского оператора.mysql>
SELECT event_name AS Stage, TRUNCATE(TIMER_WAIT/1000000000000,6) AS Duration FROM performance_schema.events_stages_history_long WHERE NESTING_EVENT_ID=31;+--------------------------------+----------+ | Stage | Duration | +--------------------------------+----------+ | stage/sql/starting | 0.000080 | | stage/sql/checking permissions | 0.000005 | | stage/sql/Opening tables | 0.027759 | | stage/sql/init | 0.000052 | | stage/sql/System lock | 0.000009 | | stage/sql/optimizing | 0.000006 | | stage/sql/statistics | 0.000082 | | stage/sql/preparing | 0.000008 | | stage/sql/executing | 0.000000 | | stage/sql/Sending data | 0.000017 | | stage/sql/end | 0.000001 | | stage/sql/query end | 0.000004 | | stage/sql/closing tables | 0.000006 | | stage/sql/freeing items | 0.000272 | | stage/sql/cleaning up | 0.000001 | +--------------------------------+----------+
© 2025 Oracle
Licensed under the GPLv2 License.