Documentation Home
MySQL 8.0 参考手册  / 第 27 章 MySQL 性能模式  / 27.12 性能模式表描述  /  25.12.6 性能模式语句事件表

25.12.6 性能模式语句事件表

Performance Schema 工具语句执行。语句事件发生在事件层次结构的高层。在事件层次结构中,等待事件嵌套在阶段事件中,阶段事件嵌套在语句事件中,语句事件嵌套在事务事件中。

这些表存储语句事件:

以下部分描述语句事件表。还有汇总表,汇总了语句事件的信息;请参阅 第 25.12.15.3 节,“语句汇总表”

有关三个事件表 之间关系的更多信息 ,请参阅第 25.9 节,“当前和历史事件的性能模式表”events_statements_xxx

配置语句事件收集

控制是否收集statement事件,设置相关instruments和consumers的状态:

  • setup_instruments表包含名称以 开头的工具 statement。使用这些工具来启用或禁用单个语句事件类的收集。

  • setup_consumers表包含名称与当前和历史语句事件表名称对应的消费者值,以及语句摘要消费者。使用这些消费者来过滤语句事件和语句摘要的集合。

默认情况下启用语句工具,并且默认启用 events_statements_currentevents_statements_historystatements_digest语句消费者:

mysql> SELECT *
       FROM performance_schema.setup_instruments
       WHERE NAME LIKE 'statement/%';
+---------------------------------------------+---------+-------+
| NAME                                        | ENABLED | TIMED |
+---------------------------------------------+---------+-------+
| statement/sql/select                        | YES     | YES   |
| statement/sql/create_table                  | YES     | YES   |
| statement/sql/create_index                  | YES     | YES   |
...
| statement/sp/stmt                           | YES     | YES   |
| statement/sp/set                            | YES     | YES   |
| statement/sp/set_trigger_field              | YES     | YES   |
| statement/scheduler/event                   | YES     | YES   |
| statement/com/Sleep                         | YES     | YES   |
| statement/com/Quit                          | YES     | YES   |
| statement/com/Init DB                       | YES     | YES   |
...
| statement/abstract/Query                    | YES     | YES   |
| statement/abstract/new_packet               | YES     | YES   |
| statement/abstract/relay_log                | YES     | YES   |
+---------------------------------------------+---------+-------+
mysql> SELECT *
       FROM performance_schema.setup_consumers
       WHERE NAME LIKE '%statements%';
+--------------------------------+---------+
| NAME                           | ENABLED |
+--------------------------------+---------+
| events_statements_current      | YES     |
| events_statements_history      | YES     |
| events_statements_history_long | NO      |
| statements_digest              | YES     |
+--------------------------------+---------+

要在服务器启动时控制语句事件收集,请在my.cnf文件中使用如下行:

  • 使能够:

    [mysqld]
    performance-schema-instrument='statement/%=ON'
    performance-schema-consumer-events-statements-current=ON
    performance-schema-consumer-events-statements-history=ON
    performance-schema-consumer-events-statements-history-long=ON
    performance-schema-consumer-statements-digest=ON
  • 禁用:

    [mysqld]
    performance-schema-instrument='statement/%=OFF'
    performance-schema-consumer-events-statements-current=OFF
    performance-schema-consumer-events-statements-history=OFF
    performance-schema-consumer-events-statements-history-long=OFF
    performance-schema-consumer-statements-digest=OFF

要在运行时控制语句事件收集,请更新 setup_instrumentssetup_consumers表:

  • 使能够:

    UPDATE performance_schema.setup_instruments
    SET ENABLED = 'YES', TIMED = 'YES'
    WHERE NAME LIKE 'statement/%';
    
    UPDATE performance_schema.setup_consumers
    SET ENABLED = 'YES'
    WHERE NAME LIKE '%statements%';
  • 禁用:

    UPDATE performance_schema.setup_instruments
    SET ENABLED = 'NO', TIMED = 'NO'
    WHERE NAME LIKE 'statement/%';
    
    UPDATE performance_schema.setup_consumers
    SET ENABLED = 'NO'
    WHERE NAME LIKE '%statements%';

要仅收集特定的语句事件,请仅启用相应的语句工具。要仅为特定语句事件表收集语句事件,请启用语句工具,但仅启用与所需表对应的语句消费者。

setup_timers表包含一个NAME值为 的 行,该行statement指示语句事件计时的单位。默认单位是 NANOSECOND

mysql> SELECT *
       FROM performance_schema.setup_timers
       WHERE NAME = 'statement';
+-----------+------------+
| NAME      | TIMER_NAME |
+-----------+------------+
| statement | NANOSECOND |
+-----------+------------+

要更改计时单位,请修改 TIMER_NAME值:

UPDATE performance_schema.setup_timers
SET TIMER_NAME = 'MICROSECOND'
WHERE NAME = 'statement';

有关配置事件收集的其他信息,请参阅第 25.3 节,“性能模式启动配置”第 25.4 节,“性能模式运行时配置”

报表监控

语句监视从服务器看到线程上请求活动的那一刻开始,到所有活动停止的那一刻。通常,这意味着从服务器从客户端收到第一个数据包到服务器完成发送响应的时间。存储程序中的语句像其他语句一样受到监视。

当性能模式检测请求(服务器命令或 SQL 语句)时,它使用从更一般(或抽象)到更具体的阶段进行的仪器名称,直到到达最终仪器名称。

最终仪器名称对应服务器命令和SQL语句:

  • 服务器命令对应 于头文件中 定义并在. 例子是和 。命令工具的名称以 开头,例如和 。 COM_xxx codesmysql_com.hsql/sql_parse.ccCOM_PINGCOM_QUITstatement/comstatement/com/Pingstatement/com/Quit

  • SQL 语句以文本形式表示,例如 DELETE FROM t1or SELECT * FROM t2。SQL 语句的工具名称以 开头statement/sql,例如 statement/sql/deleteand statement/sql/select

一些最终的仪器名称特定于错误处理:

  • statement/com/Error说明服务器收到的带外消息。它可用于检测服务器不理解的客户端发送的命令。这可能有助于识别配置错误的客户端或使用比服务器版本更新的 MySQL 版本或试图攻击服务器的客户端。

  • statement/sql/error无法解析的 SQL 语句的帐户。它可用于检测客户端发送的格式错误的查询。解析失败的查询不同于解析但由于执行过程中的错误而失败的查询。例如,SELECT * FROM格式不正确,并且 statement/sql/error使用了仪器。相比之下,SELECT *解析但失败并出现No tables used错误。在这种情况下,statement/sql/select使用了并且语句 event 包含指示错误性质的信息。

可以从以下任何来源获得请求:

  • 作为来自客户端的命令或语句请求,客户端将请求作为数据包发送

  • 作为从副本上的中继日志读取的语句字符串

  • 作为 Event Scheduler 中的事件

请求的详细信息最初是未知的,并且 Performance Schema 按照取决于请求源的顺序从抽象到特定的工具名称进行处理。

对于从客户端收到的请求:

  1. 当服务器在套接字级别检测到新数据包时,将以抽象工具名称开始一个新语句 statement/abstract/new_packet

  2. 当服务器读取数据包编号时,它会更多地了解收到的请求类型,并且 Performance Schema 会细化仪器名称。例如,如果请求是一个COM_PING数据包,则仪器名称变为statement/com/Ping最终名称。如果请求是一个 COM_QUERY数据包,则已知它对应于一条 SQL 语句而不是特定类型的语句。在这种情况下,仪器从一个抽象名称更改为一个更具体但仍然抽象的名称 statement/abstract/Query,并且该请求需要进一步分类。

  3. 如果请求是语句,则读取语句文本并将其提供给解析器。解析后,确切的语句类型是已知的。例如,如果请求是一条 INSERT语句,则 Performance Schema 会将工具名称从 最终名称 细化statement/abstract/Query为 。statement/sql/insert

对于从副本上的中继日志中读取为语句的请求:

  1. 中继日志中的语句以文本形式存储并按原样读取。没有网络协议,所以 statement/abstract/new_packet没有使用仪器。相反,初始工具是 statement/abstract/relay_log.

  2. 当语句被解析时,确切的语句类型是已知的。例如,如果请求是一条 INSERT语句,则 Performance Schema 会将工具名称从 最终名称 细化statement/abstract/Query为 。statement/sql/insert

前面的描述仅适用于基于语句的复制。对于基于行的复制,可以检测在副本处理行更改时在副本上完成的表 I/O,但中继日志中的行事件不会显示为离散语句。

对于从 Event Scheduler 收到的请求:

事件执行使用名称进行检测 statement/scheduler/event。这是最后的名字。

在事件主体内执行的语句使用 statement/sql/*名称进行检测,而不使用任何前面的抽象工具。事件是存储的程序,存储的程序在执行前在内存中预编译。因此,在运行时没有解析,并且每个语句的类型在它执行时就知道了。

在事件主体中执行的语句是子语句。例如,如果一个事件执行一条 INSERT语句,则事件本身的执行是父级,使用 进行检测 statement/scheduler/event,而 the INSERT是子级,使用 进行检测statement/sql/insert。父/子关系在单独的检测操作之间存在。这不同于单个检测操作中发生的细化顺序,从抽象到最终仪器名称。

statement/sql/*对于要为报表收集的统计信息,仅启用用于单个报表类型 的最终工具是不够的 。statement/abstract/*还必须启用抽象 工具。这通常不是问题,因为默认情况下会启用所有语句工具。但是,有选择地启用或禁用报表工具的应用程序必须考虑到禁用抽象工具也会禁用单个报表工具的统计信息收集。例如,要收集INSERT语句的统计信息, statement/sql/insert必须启用,但也statement/abstract/new_packetstatement/abstract/Query. 同样,对于要检测的复制语句, statement/abstract/relay_log必须启用。

没有为抽象工具汇总统计数据,例如 statement/abstract/Query因为没有任何语句被分类为抽象工具作为最终语句名称。