Performance Schema 會監測階段,這些階段是陳述式執行過程中的步驟,例如剖析陳述式、開啟表格或執行 filesort
作業。階段對應於 SHOW PROCESSLIST
所顯示的執行緒狀態,或在 Information Schema PROCESSLIST
表格中可見的狀態。當狀態值變更時,階段會開始和結束。
在事件階層中,等候事件會巢狀於階段事件內,階段事件會巢狀於陳述式事件內,陳述式事件會巢狀於交易事件內。
這些表格會儲存階段事件
events_stages_current
:每個執行緒的目前階段事件。events_stages_history
:每個執行緒已結束的最新階段事件。events_stages_history_long
:已全域結束 (跨所有執行緒) 的最新階段事件。
以下章節將說明階段事件表格。也有摘要表格會彙總關於階段事件的資訊;請參閱章節 29.12.20.2,「階段摘要表格」。
如需關於三個階段事件表格之間關聯的詳細資訊,請參閱章節 29.9,「Performance Schema 目前和歷史事件的表格」。
設定階段事件收集
若要控制是否收集階段事件,請設定相關儀器和消費者的狀態
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,「Performance Schema 啟動組態」,以及章節 29.4,「Performance Schema 執行階段組態」。
階段事件進度資訊
效能結構描述的階段事件表格包含兩個欄位,兩者結合起來可以為每一列提供階段進度指示器
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
表格中選取。