MySQL8.0使用performance_schema分析一條SQL的具體執行時間
新版的MySQL已經徹底移除了以前ProFile的大多數功能
第一步
SELECT *
FROM performance_schema.setup_actors;
這是用於配置是否爲新的前臺server線程(與客戶端連接相關聯的線程)啓用監視和歷史事件日誌記錄的表
第二步
UPDATE performance_schema.setup_actors
SET ENABLED = 'NO',
HISTORY = 'NO'
WHERE HOST = '%'
AND USER = '%';
關閉HOST爲%並且USER爲%的記錄功能(這個功能在MySQL重啓後會自動還原)
這個時候我們在查看第一步的SQL檢查是否關閉
第三步
INSERT INTO performance_schema.setup_actors
(HOST, USER, ROLE, ENABLED, HISTORY)
VALUES ('localhost', 'test_user', '%', 'YES', 'YES');
我們自己往setup_actors 表中插入一個自定義用戶用於記錄,HOST指定爲localhost,USER指定爲test_user,並且開啓日誌監控和記錄
此時我們再去查看第一步SQL驗證是否插入成功
第四步
UPDATE performance_schema.setup_instruments
SET ENABLED = 'YES', TIMED = 'YES'
WHERE NAME LIKE '%statement/%';
UPDATE performance_schema.setup_instruments
SET ENABLED = 'YES', TIMED = 'YES'
WHERE NAME LIKE '%stage/%';
UPDATE performance_schema.setup_consumers
SET ENABLED = 'YES'
WHERE NAME LIKE '%events_statements_%';
sql
UPDATE performance_schema.setup_consumers
SET ENABLED = 'YES'
WHERE NAME LIKE '%events_stages_%';
設置系統記錄哪些事件,在setup_instruments表中可以看到所有的事件支持,在setup_consumers表中可以看到一些我也不知道是什麼的數據,反正就是一些監控的配置,YES代表啓用,NO代表不啓用
第五步
select *
from emp
where emane = 'FJIkdL';
執行需要檢測事件的SQL語句
第六步
SELECT EVENT_ID, TRUNCATE(TIMER_WAIT/1000000000000,6) as Duration, SQL_TEXT
FROM performance_schema.events_statements_history_long;
查詢所有的日誌記錄類似於以前的show profiles;每一個記錄都會帶一個id
第七步
SELECT event_name AS Stage, TRUNCATE(TIMER_WAIT / 1000000000000, 6) AS Duration
FROM performance_schema.events_stages_history_long
WHERE NESTING_EVENT_ID = 327;
根據上面的EVENT_ID查詢每一個事件的詳細執行時間