以下範例示範如何使用效能架構陳述式事件和階段事件,來擷取與 SHOW PROFILES
和 SHOW PROFILE
陳述式所提供的效能分析資訊相當的資料。
setup_actors
資料表可用於限制依主機、使用者或帳戶收集歷史事件,以減少執行階段額外負荷,以及歷史資料表中收集的資料量。此範例的第一個步驟顯示如何將歷史事件的收集限制為特定使用者。
效能架構以微微秒(一秒的兆分之一)顯示事件計時器資訊,以便將計時資料正規化為標準單位。在下列範例中,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_actors SET 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_instruments SET ENABLED = 'YES', TIMED = 'YES' WHERE NAME LIKE '%statement/%'; mysql> UPDATE performance_schema.setup_instruments SET ENABLED = 'YES', TIMED = 'YES' WHERE NAME LIKE '%stage/%';
確保已啟用
events_statements_*
和events_stages_*
消費者。某些消費者可能已預設啟用。mysql> UPDATE performance_schema.setup_consumers SET ENABLED = 'YES' WHERE NAME LIKE '%events_statements_%'; mysql> UPDATE performance_schema.setup_consumers SET 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 | +--------+------------+------------+-----------+--------+------------+
透過查詢
events_statements_history_long
表格,找出語句的EVENT_ID
。這個步驟類似於執行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 | +--------------------------------+----------+