Performance Schema检测语句的执行。语句事件发生在事件层次结构的较高级别。在事件层次结构中,等待事件嵌套在阶段事件内,嵌套在语句事件内,嵌套在事务事件内。
这些表存储语句事件:
events_statements_current
:每个线程的当前语句事件。events_statements_history
:每个线程已结束的最新语句事件。events_statements_history_long
:全局(在所有线程中)结束的最新语句事件。prepared_statements_instances
:准备好的语句实例和统计信息
以下各节描述了语句事件表。也有汇总表,汇总有关语句事件的信息。请参见“语句摘要表”。
有关三个事件表之间关系的更多信息,请参见“当前和历史事件的性能架构表”。events_statements_xxx
配置语句事件整理
要控制是否收集语句事件,请设置相关工具和使用者的状态:
- 该
setup_instruments
表包含名称以开头的乐器statement
。使用这些工具可以启用或禁用单个语句事件类的收集。 - 该
setup_consumers
表包含名称与当前和历史语句事件表名称相对应的使用者值,以及语句摘要使用者。使用这些使用者来过滤语句事件和语句摘要的集合。
声明工具在默认情况下启用,并且events_statements_current
,events_statements_history
和statements_digest
语句消费者是默认启用的:
mysql> SELECT NAME, ENABLED, TIMED 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_instruments
和setup_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%';
要仅收集特定的语句事件,请仅启用相应的语句工具。要仅为特定的语句事件表收集语句事件,请启用语句工具,但仅启用与所需表相对应的语句使用者。
有关配置事件收集的其他信息,请参见“性能架构启动配置”和“性能架构运行时配置”。
报表监控
语句监视从服务器看到线程上请求活动的那一刻开始,到所有活动都停止的那一刻开始。通常,这意味着从服务器从客户端获取第一个数据包到服务器完成发送响应的时间。像其他语句一样,对存储程序中的语句进行监视。
当性能模式对请求(服务器命令或SQL语句)进行检测时,它将使用从更通用(或“抽象”)到更具体的阶段逐步进行的设备名称,直到到达最终的设备名称为止。
最终的仪器名称对应于服务器命令和SQL语句:
- 服务器命令与头文件中定义的命令相对应,并在中处理。例子是和。命令工具的名称以开头,例如和。
COM_xxx codes
mysql_com.h
sql/sql_parse.cc
COM_PING
COM_QUIT
statement/com
statement/com/Ping
statement/com/Quit
- SQL语句表示为文本,例如
DELETE FROM t1
或SELECT * FROM t2
。用于SQL语句的工具的名称以开头statement/sql
,例如statement/sql/delete
和statement/sql/select
。
一些最终的仪器名称特定于错误处理:
statement/com/Error
表示服务器接收的带外消息。它可用于检测服务器不理解的客户端发送的命令。这对于以下目的可能是有帮助的,例如识别配置错误的客户端或使用比服务器版本新的MySQL版本,或尝试攻击服务器的客户端。statement/sql/error
解析失败的SQL语句。它可用于检测客户端发送的格式错误的查询。解析失败的查询与解析但由于执行期间的错误而失败的查询不同。例如,SELECT * FROM
格式错误,并且使用了statement/sql/error
仪器。相反,SELECT *
解析但失败并显示No tables used
错误。在这种情况下,statement/sql/select
使用和语句事件包含指示错误性质的信息。
可以从以下任何来源获得请求:
- 作为来自客户端的命令或语句请求,客户端将请求作为数据包发送
- 作为语句字符串从复制从属服务器上的中继日志中读取
- 作为事件计划程序中的事件
最初不知道请求的详细信息,并且性能模式会根据请求的源顺序从抽象到特定的仪器名称。
对于来自客户的请求:
- 当服务器在套接字级别检测到新数据包时,将以抽象工具名称开头一条新语句
statement/abstract/new_packet
。 - 当服务器读取数据包编号时,它会更多地了解收到的请求的类型,并且“性能模式”会优化工具名称。例如,如果请求是
COM_PING
数据包,则仪器名称将变为statement/com/Ping
,即最终名称。如果请求是COM_QUERY
数据包,则已知它对应于一个SQL语句,而不是特定类型的语句。在这种情况下,工具会从一个抽象名称更改为更具体但仍是抽象的名称statement/abstract/Query
,并且请求需要进一步分类。 - 如果请求是语句,则读取语句文本并将其提供给解析器。解析后,确切的语句类型是已知的。例如,如果请求是一条
INSERT
语句,则“性能模式”会将工具名称从细化statement/abstract/Query
为statement/sql/insert
,这是最终名称。
对于请求,从复制从属服务器上的中继日志中读取为语句:
- 中继日志中的语句以文本形式存储并按原样读取。没有网络协议,因此
statement/abstract/new_packet
不使用仪器。相反,初始工具为statement/abstract/relay_log
。 - 解析该语句时,确切的语句类型是已知的。例如,如果请求是一条
INSERT
语句,则“性能模式”会将工具名称从细化statement/abstract/Query
为statement/sql/insert
,这是最终名称。
前面的描述仅适用于基于语句的复制。对于基于行的复制,可以检测从属服务器在处理行更改时完成的表I / O,但中继日志中的行事件不会显示为离散语句。
对于从事件计划程序收到的请求:
使用名称来检测事件执行statement/scheduler/event
。这是最终名称。
在事件主体中执行的语句使用statement/sql/*
名称进行检测,而无需使用任何先前的抽象工具。事件是存储的程序,并且存储的程序在执行之前已预先在内存中编译。因此,在运行时没有解析,并且每个语句的类型在执行时就已知道。
在事件主体中执行的语句是子语句。例如,如果一个事件执行的INSERT
语句,事件本身的执行是父,使用仪器statement/scheduler/event
,并INSERT
为孩子使用仪器statement/sql/insert
。父/子关系在单独的工具操作之间保持。这不同于细化发生该序列内的单个仪器化操作中,从抽象到最终乐器名称。
对于要为报表收集统计信息,仅启用statement/sql/*
用于单个报表类型的最终工具是不够的。还statement/abstract/*
必须启用抽象工具。这通常不会成为问题,因为默认情况下启用了所有语句工具。但是,有选择地启用或禁用语句工具的应用程序必须考虑到禁用抽象工具也将禁用单个语句工具的统计信息收集。例如,用于收集统计INSERT
报表,statement/sql/insert
必须启用,也statement/abstract/new_packet
和statement/abstract/Query
。同样,对于要检测的复制语句,statement/abstract/relay_log
必须启用。
没有汇总抽象工具的统计信息,例如,statement/abstract/Query
因为没有语句被抽象工具归类为最终语句名称。