性能方案测试语句执行。语句事件发生在事件层次结构的高层。在事件层次结构中,等待事件嵌套在阶段事件中,阶段事件嵌套在语句事件中,语句事件嵌套在事务事件中。
这些表存储语句事件:
events_statements_current
:每个线程的当前语句事件。events_statements_history
:每个线程最近结束的语句事件。events_statements_history_long
:全局结束的最近的语句事件(跨所有线程)。prepared_statements_instances
:准备好的语句实例和统计信息
下面几节描述语句事件表。还有汇总语句事件信息的汇总表;看到第27.12.20.3节“报表汇总表”.
有关三者之间关系的更多信息events_statements_
事件表,请参阅第27.9节“当前和历史事件的性能模式表”.xxx
配置语句事件收集
要控制是否收集语句事件,可以设置相关工具和消费者的状态:
的
setup_instruments
表包含名称以“。”开头的仪器声明
.使用这些工具可以启用或禁用单个语句事件类的集合。的
setup_consumers
表包含名称与当前和历史语句事件表名称对应的消费者值,以及语句摘要消费者。使用这些消费者来筛选语句事件和语句摘要的集合。
语句工具在默认情况下是启用的,而events_statements_current
,events_statements_history
,statements_digest
默认情况下,语句消费者是启用的:
mysql> SELECT NAME, ENABLED, TIMED FROM performance_schema。setup_instruments WHERE NAME LIKE 'statement/%';+---------------------------------------------+---------+-------+ | 名字| |定时启用 | +---------------------------------------------+---------+-------+ | 声明/ sql /选择|是的| | |声明/ sql / create_table |是的| | |声明/ sql / create_index |是的| |…| statement/sp/stmt | YES | YES | | statement/sp/set | YES | YES | | statement/sp/set_trigger_field | YES | YES | b| statement/scheduler/event | YES | YES | | statement/com/Sleep | YES | YES | | statement/com/Quit | YES | YES | | statement/com/Init DB | YES | YES |…|声明/文摘/查询|是的| | |声明/文摘/ new_packet |是的| | |声明/文摘/ relay_log | |是的 | +---------------------------------------------+---------+-------+
SELECT * FROM performance_schema。setup_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%';
若要只收集特定的语句事件,请只启用相应的语句工具。若要仅为特定语句事件表收集语句事件,请启用语句工具,但只启用与所需表对应的语句使用者。
有关配置事件收集的其他信息,请参见第27.3节“性能模式启动配置”,第27.4节“性能模式运行时配置”.
声明中监测
从服务器看到线程上的活动被请求的那一刻开始,直到所有活动停止的那一刻,语句监视就开始了。通常,这意味着从服务器从客户机获得第一个包到服务器完成发送响应的时间。像监视其他语句一样监视存储程序中的语句。
当性能模式检测一个请求(服务器命令或SQL语句)时,它使用从更通用的(或”摘要”),直到得到最终的乐器名称。
最终仪器名称对应服务器命令和SQL语句:
服务器命令对应于
COM_
中定义的xxx
代码mysql_com.h
头文件和处理sql / sql_parse.cc
.的例子是COM_PING
而且COM_QUIT
.用于命令的工具的名称以声明/ com
,如声明/ com/Ping
而且声明/ com/Quit
.SQL语句表示为文本,例如
删除从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
必须启用。
没有对抽象的工具进行统计声明/文摘/查询
因为没有一个报表是用抽象工具作为最终报表名称来分类的。