性能模式检测语句执行。语句事件发生在事件层次结构的高层。在事件层次结构中,等待事件嵌套在阶段事件中,阶段事件嵌套在语句事件中,语句事件嵌套在事务事件中。
这些表存储语句事件:
events_statements_current
:每个线程的当前语句事件。events_statements_history
:每个线程结束的最近语句事件。events_statements_history_long
:已全局结束的最近语句事件(跨所有线程)。prepared_statements_instances
:准备好的语句实例和统计信息
下面几节描述语句事件表。还有汇总语句事件信息的汇总表;看到第25.12.15.3节“报表汇总表”.
获取更多关于三者之间关系的信息events_statements_
事件表,请参见第25.9节,“当前和历史事件的性能模式表”.xxx
配置语句事件收集
要控制是否收集语句事件,可以设置相关工具和消费者的状态:
的
setup_instruments
表中包含名称以声明
.使用这些工具可以启用或禁用单个语句事件类的集合。的
setup_consumers
表包含使用者值,其名称对应于当前和历史语句事件表名称,以及语句摘要使用者。使用这些消费者来筛选语句事件集合和语句摘要。
语句工具在默认情况下是启用的,而events_statements_current
,events_statements_history
,statements_digest
语句消费者默认启用:
mysql> SELECT * FROM performance_schemasetup_instrumentsWHERE 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_schemasetup_consumersWHERE 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_instruments
而且setup_consumers
表:
启用:
更新performance_schema。setup_instrumentsSET ENABLED = 'YES', TIMED = 'YES' WHERE NAME LIKE 'statement/%'; UPDATE performance_schema.setup_consumers SET ENABLED = 'YES' WHERE NAME LIKE '%statements%';
禁用:
更新performance_schema。setup_instrumentsSET ENABLED = 'NO', TIMED = 'NO' WHERE NAME LIKE 'statement/%'; UPDATE performance_schema.setup_consumers SET ENABLED = 'NO' WHERE NAME LIKE '%statements%';
若要仅收集特定的语句事件,请仅启用相应的语句工具。若要仅为特定语句事件表收集语句事件,请启用语句工具,但只启用与所需表对应的语句使用者。
的setup_timer
表包含一行的名字
的价值声明
指示语句事件计时的单位。默认单位为纳秒
:
mysql> SELECT * FROM performance_schemasetup_timers WHERE NAME = '语句';+-----------+------------+ | 名字| TIMER_NAME | +-----------+------------+ | 声明|纳秒 | +-----------+------------+
若要更改定时单位,请修改TIMER_NAME
值:
更新performance_schema。setup_timerSET TIMER_NAME = 'MICROSECOND' WHERE NAME = 'statement';
有关配置事件收集的其他信息,请参见第25.3节,“性能模式启动配置”,第25.4节,“性能模式运行时配置”.
声明中监测
语句监视从服务器看到线程上请求活动的那一刻开始,直到所有活动停止为止。通常,这意味着从服务器从客户端获得第一个数据包到服务器完成发送响应的时间。存储程序中的语句像其他语句一样被监视。
当性能模式检测一个请求(服务器命令或SQL语句)时,它使用的仪器名称分阶段从更一般的(或”摘要”)到更具体的,直到得出最终的乐器名称。
最终的仪器名称对应于服务器命令和SQL语句:
服务器命令对应于
COM_
定义在xxx
代码mysql_com.h
头文件和处理sql / sql_parse.cc
.的例子是COM_PING
而且COM_QUIT
.命令工具的名称以声明/ com
,例如声明/ com/Ping
而且声明/ com/Quit
.SQL语句以文本形式表示,例如
DELETE FROM t1
或SELECT * FROM t2
.SQL语句工具的名称以声明/ sql
,例如声明/ sql /删除
而且声明/ sql /选择
.
一些最终的仪器名称是特定于错误处理的:
声明/ com/Error
服务器接收到的非带外消息的帐户。它可以用来检测服务器无法理解的客户端发送的命令。这可能有助于识别错误配置的客户端或使用比服务器更新的MySQL版本的客户端,或试图攻击服务器的客户端。声明/ sql /错误
无法解析的SQL语句的帐户。它可以用来检测客户端发送的格式错误的查询。解析失败的查询不同于解析但由于执行期间的错误而失败的查询。例如,Select * from
是畸形的,而声明/ sql /错误
使用仪器。相比之下,SELECT *
解析,但失败没有使用表
错误。在这种情况下,声明/ sql /选择
语句事件包含指示错误性质的信息。
请求可以从以下任何一个来源获得:
作为来自客户端的命令或语句请求,以包的形式发送请求
作为从副本上的中继日志中读取的语句字符串
作为来自事件调度器的事件
请求的详细信息最初是不知道的,性能模式按照依赖于请求源的顺序从抽象到具体的仪器名称。
对于从客户端接收的请求:
当服务器在套接字级别检测到一个新数据包时,一个新的语句以抽象的仪器名称开始
声明/文摘/ new_packet
.当服务器读取数据包编号时,它会了解更多关于接收到的请求类型的信息,并且性能模式会细化仪器名称。例如,如果请求是一个
COM_PING
包时,仪器名称变为声明/ com/Ping
这就是最终的名称。如果请求是COM_QUERY
数据包,它是已知的对应SQL语句,而不是特定类型的语句。在这种情况下,乐器从一个抽象的名字变成了一个更具体但仍然抽象的名字,声明/文摘/查询
,而有关要求需要进一步分类。如果请求是语句,则读取语句文本并将其提供给解析器。解析之后,就知道确切的语句类型了。例如,如果请求是
插入
语句,性能模式将从中细化仪器名称声明/文摘/查询
来声明/ sql /插入
,这是最终的名字。
对于从副本的中继日志中读取的请求:
中继日志中的语句以文本形式存储,并按文本方式读取。没有网络协议,所以
声明/文摘/ new_packet
仪器没有使用。相反,最初的乐器是声明/文摘/ relay_log
.当语句被解析时,确切的语句类型是已知的。例如,如果请求是
插入
语句,性能模式将从中细化仪器名称声明/文摘/查询
来声明/ sql /插入
,这是最终的名字。
上述描述仅适用于基于语句的复制。对于基于行的复制,可以检测在副本上处理行更改时执行的表I/O,但是中继日志中的行事件不会显示为离散语句。
对于从事件调度器接收的请求:
事件执行使用名称进行检测声明/调度器/事件
.这是最终的名称。
在事件体中执行的语句使用声明/ sql / *
名称,不使用任何先前的抽象工具。事件是一个存储程序,存储程序在执行前在内存中预编译。因此,在运行时不进行解析,每个语句的类型在执行时就已经知道了。
在事件体中执行的语句是子语句。例如,如果一个事件执行插入
语句,执行事件本身就是父事件,使用工具声明/调度器/事件
,以及插入
孩子会被工具化使用吗声明/ sql /插入
.父/子关系成立之间的单独的仪器操作。这与发生的细化顺序不同在一个单一的仪器操作,从抽象到最终的仪器名称。
要为语句收集统计信息,仅启用final是不够的声明/ sql / *
用于个别报表类型的工具。的abtract声明抽象/ * /
仪器也必须启用。这通常不是问题,因为默认情况下所有语句工具都是启用的。然而,有选择地启用或禁用语句工具的应用程序必须考虑禁用抽象工具也会禁用单个语句工具的统计信息收集。例如,收集的统计信息插入
语句,声明/ sql /插入
必须启用,但也声明/文摘/ new_packet
而且声明/文摘/查询
.类似地,对于要检测的复制语句,声明/文摘/ relay_log
必须启用。
对于抽象工具,例如声明/文摘/查询
因为没有一个语句被归类为抽象的工具作为最终的语句名称。