效能架構會檢測階段,這些階段是陳述式執行過程中的步驟,例如剖析陳述式、開啟表格或執行 filesort
作業。階段對應於 SHOW PROCESSLIST
顯示或資訊架構 PROCESSLIST
表格中可見的執行緒狀態。當狀態值變更時,階段會開始和結束。
在事件階層中,等待事件會巢狀於階段事件中,而階段事件會巢狀於陳述式事件中,而陳述式事件會巢狀於交易事件中。
這些表格會儲存階段事件
events_stages_current
:每個執行緒的目前階段事件。events_stages_history
:每個執行緒已結束的最新階段事件。events_stages_history_long
:全域 (跨所有執行緒) 已結束的最新階段事件。
以下章節說明階段事件表格。也有摘要表格會彙總關於階段事件的資訊;請參閱第 29.12.20.2 節,「階段摘要表格」。
如需關於三個階段事件表格之間關係的詳細資訊,請參閱第 29.9 節,「用於目前和歷史事件的效能架構表格」。
設定階段事件收集
若要控制是否收集階段事件,請設定相關工具和消費者的狀態
setup_instruments
表格包含名稱以stage
開頭的工具。使用這些工具來啟用或停用個別階段事件類別的收集。setup_consumers
表格包含與目前和歷史階段事件表格名稱對應的消費者值。使用這些消費者來篩選階段事件的收集。
除了那些提供陳述式進度資訊的工具之外,階段工具預設為停用。例如
mysql> SELECT NAME, ENABLED, TIMED
FROM performance_schema.setup_instruments
WHERE NAME RLIKE 'stage/sql/[a-c]';
+----------------------------------------------------+---------+-------+
| NAME | ENABLED | TIMED |
+----------------------------------------------------+---------+-------+
| stage/sql/After create | NO | NO |
| stage/sql/allocating local table | NO | NO |
| stage/sql/altering table | NO | NO |
| stage/sql/committing alter table to storage engine | NO | NO |
| stage/sql/Changing master | NO | NO |
| stage/sql/Checking master version | NO | NO |
| stage/sql/checking permissions | NO | NO |
| stage/sql/cleaning up | NO | NO |
| stage/sql/closing tables | NO | NO |
| stage/sql/Connecting to master | NO | NO |
| stage/sql/converting HEAP to MyISAM | NO | NO |
| stage/sql/Copying to group table | NO | NO |
| stage/sql/Copying to tmp table | NO | NO |
| stage/sql/copy to tmp table | NO | NO |
| stage/sql/Creating sort index | NO | NO |
| stage/sql/creating table | NO | NO |
| stage/sql/Creating tmp table | NO | NO |
+----------------------------------------------------+---------+-------+
預設會啟用和計時提供陳述式進度資訊的階段事件工具
mysql> SELECT NAME, ENABLED, TIMED
FROM performance_schema.setup_instruments
WHERE ENABLED='YES' AND NAME LIKE "stage/%";
+------------------------------------------------------+---------+-------+
| NAME | ENABLED | TIMED |
+------------------------------------------------------+---------+-------+
| stage/sql/copy to tmp table | YES | YES |
| stage/sql/Applying batch of row changes (write) | YES | YES |
| stage/sql/Applying batch of row changes (update) | YES | YES |
| stage/sql/Applying batch of row changes (delete) | YES | YES |
| stage/innodb/alter table (end) | YES | YES |
| stage/innodb/alter table (flush) | YES | YES |
| stage/innodb/alter table (insert) | YES | YES |
| stage/innodb/alter table (log apply index) | YES | YES |
| stage/innodb/alter table (log apply table) | YES | YES |
| stage/innodb/alter table (merge sort) | YES | YES |
| stage/innodb/alter table (read PK and internal sort) | YES | YES |
| stage/innodb/buffer pool load | YES | YES |
| stage/innodb/clone (file copy) | YES | YES |
| stage/innodb/clone (redo copy) | YES | YES |
| stage/innodb/clone (page copy) | YES | YES |
+------------------------------------------------------+---------+-------+
階段消費者預設為停用
mysql> SELECT *
FROM performance_schema.setup_consumers
WHERE NAME LIKE 'events_stages%';
+----------------------------+---------+
| NAME | ENABLED |
+----------------------------+---------+
| events_stages_current | NO |
| events_stages_history | NO |
| events_stages_history_long | NO |
+----------------------------+---------+
若要在伺服器啟動時控制階段事件收集,請在您的 my.cnf
檔案中使用如下的行
啟用
[mysqld] performance-schema-instrument='stage/%=ON' performance-schema-consumer-events-stages-current=ON performance-schema-consumer-events-stages-history=ON performance-schema-consumer-events-stages-history-long=ON
停用
[mysqld] performance-schema-instrument='stage/%=OFF' performance-schema-consumer-events-stages-current=OFF performance-schema-consumer-events-stages-history=OFF performance-schema-consumer-events-stages-history-long=OFF
若要在執行階段控制階段事件收集,請更新 setup_instruments
和 setup_consumers
表格
啟用
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_stages%';
停用
UPDATE performance_schema.setup_instruments SET ENABLED = 'NO', TIMED = 'NO' WHERE NAME LIKE 'stage/%'; UPDATE performance_schema.setup_consumers SET ENABLED = 'NO' WHERE NAME LIKE 'events_stages%';
若只要收集特定階段事件,請僅啟用對應的階段工具。若要僅針對特定階段事件表格收集階段事件,請啟用階段工具,但僅啟用對應於所需表格的階段消費者。
關於設定事件收集的更多資訊,請參閱第 29.3 節「效能架構啟動設定」和第 29.4 節「效能架構執行階段設定」。
階段事件進度資訊
效能架構階段事件表格包含兩個欄位,它們加總起來可為每一列提供階段進度指示器
WORK_COMPLETED
:階段已完成的工作單元數WORK_ESTIMATED
:階段預計的工作單元數
如果沒有為儀器提供進度資訊,則每個欄位都是 NULL
。如果可以使用,資訊的解釋完全取決於儀器的實作。效能架構表格提供一個儲存進度資料的容器,但不對度量的語義做任何假設
「工作單元」是一個在執行期間隨時間增加的整數度量,例如已處理的位元組數、列數、檔案數或表格數。特定儀器的「工作單元」定義留給提供資料的儀器程式碼。
WORK_COMPLETED
值可以一次增加一個或多個單位,具體取決於儀器化的程式碼。WORK_ESTIMATED
值可以在階段期間變更,具體取決於儀器化的程式碼。
階段事件進度指示器的儀器化可以實作以下任何行為
沒有進度儀器化
這是最典型的情況,其中未提供進度資料。
WORK_COMPLETED
和WORK_ESTIMATED
欄位均為NULL
。無界限的進度儀器化
只有
WORK_COMPLETED
欄位有意義。沒有為WORK_ESTIMATED
欄位提供任何資料,該欄位顯示 0。透過查詢監視工作階段的
events_stages_current
表格,監控應用程式可以報告到目前為止已完成多少工作,但無法報告階段是否接近完成。目前,沒有任何階段以這種方式進行儀器化。有界限的進度儀器化
WORK_COMPLETED
和WORK_ESTIMATED
欄位均有意義。此類進度指示器適用於具有已定義完成標準的操作,例如稍後描述的表格複製儀器。透過查詢監視工作階段的
events_stages_current
表格,監控應用程式可以報告到目前為止已完成多少工作,並可透過計算WORK_COMPLETED
/WORK_ESTIMATED
比率來報告階段的整體完成百分比。
stage/sql/copy to tmp table
儀器說明進度指示器如何運作。在執行 ALTER TABLE
陳述式期間,會使用 stage/sql/copy to tmp table
階段,而且此階段可能會執行很長一段時間,具體取決於要複製的資料大小。
表格複製工作具有已定義的終止 (複製所有列),並且 stage/sql/copy to tmp table
階段經過儀器化以提供有界限的進度資訊:使用的工作單元是複製的列數,WORK_COMPLETED
和 WORK_ESTIMATED
都有意義,並且它們的比率表示工作完成百分比。
若要啟用儀器和相關的取用者,請執行這些陳述式
UPDATE performance_schema.setup_instruments
SET ENABLED='YES'
WHERE NAME='stage/sql/copy to tmp table';
UPDATE performance_schema.setup_consumers
SET ENABLED='YES'
WHERE NAME LIKE 'events_stages_%';
若要查看正在進行的 ALTER TABLE
陳述式的進度,請從events_stages_current
表格中選取。