Performance Schema 仪器阶段,它们是语句执行过程中的步骤,例如解析语句、打开表或执行
filesort
操作。阶段对应于表中显示的SHOW
PROCESSLIST
或可见
的线程状态INFORMATION_SCHEMA.PROCESSLIST
。当状态值改变时,阶段开始和结束。
在事件层次结构中,等待事件嵌套在阶段事件中,阶段事件嵌套在语句事件中,语句事件嵌套在事务事件中。
这些表存储阶段事件:
events_stages_current
:每个线程的当前阶段事件。events_stages_history
:每个线程结束的最近阶段事件。events_stages_history_long
:全局结束的最新阶段事件(跨所有线程)。
以下部分描述阶段事件表。也有汇集阶段事件信息的汇总表;参见 第 25.12.15.2 节,“阶段汇总表”。
有关三个阶段事件表之间关系的更多信息,请参阅 第 25.9 节,“当前和历史事件的性能模式表”。
配置阶段事件收集
控制是否采集stage事件,设置相关instruments和consumer的状态:
该
setup_instruments
表包含名称以 开头的工具stage
。使用这些工具来启用或禁用各个阶段事件类的收集。该
setup_consumers
表包含名称与当前和历史阶段事件表名称相对应的消费者值。使用这些消费者来过滤阶段事件的集合。
除了那些提供语句进度信息的工具外,阶段工具默认是禁用的。例如:
mysql> SELECT *
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/checking privileges on cached query | NO | NO |
| stage/sql/checking query cache for query | 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 *
FROM performance_schema.setup_instruments
WHERE ENABLED='YES' AND NAME LIKE "stage/%";
+------------------------------------------------------+---------+-------+
| NAME | ENABLED | TIMED |
+------------------------------------------------------+---------+-------+
| stage/sql/copy to tmp table | 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 |
+------------------------------------------------------+---------+-------+
默认情况下禁用阶段消费者:
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%';
要仅收集特定的舞台事件,请仅启用相应的舞台乐器。要仅为特定阶段事件表收集阶段事件,请启用阶段工具,但仅启用与所需表对应的阶段消费者。
该setup_timers
表包含一个NAME
值为 的
行,该行stage
指示阶段事件计时的单位。默认单位是NANOSECOND
:
mysql> SELECT *
FROM performance_schema.setup_timers
WHERE NAME = 'stage';
+-------+------------+
| NAME | TIMER_NAME |
+-------+------------+
| stage | NANOSECOND |
+-------+------------+
要更改计时单位,请修改
TIMER_NAME
值:
UPDATE performance_schema.setup_timers
SET TIMER_NAME = 'MICROSECOND'
WHERE NAME = 'stage';
有关配置事件收集的其他信息,请参阅第 25.3 节,“性能模式启动配置”和第 25.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
表中选择。