性能模式检测阶段,即语句执行过程中的步骤,例如解析语句、打开表或执行 filesort
操作。阶段对应于由 SHOW PROCESSLIST
显示的线程状态,或在 Information Schema 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 节,“性能模式运行时配置”。
阶段事件进度信息
Performance Schema 阶段事件表包含两个列,它们一起为每一行提供一个阶段进度指示器
WORK_COMPLETED
:阶段完成的工作单元数WORK_ESTIMATED
:阶段预期工作单元数
如果仪器没有提供进度信息,则每列都是 NULL
。如果提供了信息,则信息解释完全取决于仪器实现。Performance Schema 表提供了一个容器来存储进度数据,但不对指标本身的语义做任何假设
一个 “工作单元” 是一个整数指标,在执行期间随着时间的推移而增加,例如已处理的字节数、行数、文件数或表数。特定仪器的 “工作单元” 的定义留给提供数据的仪器代码。
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
表中选择。