性能模式维护当前和最近的语句事件表,并将该信息聚合到摘要表中。第 29.12.6 节,“性能模式语句事件表” 描述了语句摘要基于的事件。请参阅该讨论了解语句事件的内容、当前和历史语句事件表,以及如何控制语句事件收集,默认情况下部分禁用。
示例语句事件摘要信息:
mysql> SELECT *
FROM performance_schema.events_statements_summary_global_by_event_name\G
*************************** 1. row ***************************
EVENT_NAME: statement/sql/select
COUNT_STAR: 54
SUM_TIMER_WAIT: 38860400000
MIN_TIMER_WAIT: 52400000
AVG_TIMER_WAIT: 719600000
MAX_TIMER_WAIT: 12631800000
SUM_LOCK_TIME: 88000000
SUM_ERRORS: 0
SUM_WARNINGS: 0
SUM_ROWS_AFFECTED: 0
SUM_ROWS_SENT: 60
SUM_ROWS_EXAMINED: 120
SUM_CREATED_TMP_DISK_TABLES: 0
SUM_CREATED_TMP_TABLES: 21
SUM_SELECT_FULL_JOIN: 16
SUM_SELECT_FULL_RANGE_JOIN: 0
SUM_SELECT_RANGE: 0
SUM_SELECT_RANGE_CHECK: 0
SUM_SELECT_SCAN: 41
SUM_SORT_MERGE_PASSES: 0
SUM_SORT_RANGE: 0
SUM_SORT_ROWS: 0
SUM_SORT_SCAN: 0
SUM_NO_INDEX_USED: 22
SUM_NO_GOOD_INDEX_USED: 0
SUM_CPU_TIME: 0
MAX_CONTROLLED_MEMORY: 2028360
MAX_TOTAL_MEMORY: 2853429
COUNT_SECONDARY: 0
...
每个语句摘要表都有一个或多个分组列,以指示表如何聚合事件。事件名称引用 setup_instruments
表中的事件仪表名称:
-
events_statements_summary_by_account_by_event_name
有EVENT_NAME
、USER
和HOST
列。每行总结了给定帐户(用户和主机组合)和事件名称的事件。 -
events_statements_summary_by_digest
有SCHEMA_NAME
和DIGEST
列。每行总结了每个架构和摘要值的事件。(DIGEST_TEXT
列包含相应的标准化语句摘要文本,但既不是分组列也不是摘要列。QUERY_SAMPLE_TEXT
、QUERY_SAMPLE_SEEN
和QUERY_SAMPLE_TIMER_WAIT
列也不是分组列或摘要列;它们支持语句采样。)表中的最大行数在服务器启动时自动调整大小。要明确设置该最大值,请在服务器启动时设置
performance_schema_digests_size
系统变量。 -
events_statements_summary_by_host_by_event_name
有EVENT_NAME
和HOST
列。每行总结了给定主机和事件名称的事件。 -
events_statements_summary_by_program
有OBJECT_TYPE
、OBJECT_SCHEMA
和OBJECT_NAME
列。每行总结了给定存储程序(存储过程或函数、触发器或事件)的事件。 -
events_statements_summary_by_thread_by_event_name
有THREAD_ID
和EVENT_NAME
列。每行总结了给定线程和事件名称的事件。 -
events_statements_summary_by_user_by_event_name
有EVENT_NAME
和USER
列。每行总结了给定用户和事件名称的事件。 -
events_statements_summary_global_by_event_name
有一个EVENT_NAME
列。每行总结了给定事件名称的事件。 -
prepared_statements_instances
有一个OBJECT_INSTANCE_BEGIN
列。每行总结了给定预备语句的事件。
每个语句摘要表都有这些摘要列,包含聚合值(除非另有说明):
-
COUNT_STAR
、SUM_TIMER_WAIT
、MIN_TIMER_WAIT
、AVG_TIMER_WAIT
、MAX_TIMER_WAIT
这些列类似于等待事件摘要表中的同名列(见第 29.12.20.1 节,“等待事件摘要表”),只是语句摘要表聚合来自
events_statements_current
而不是events_waits_current
的事件。The
prepared_statements_instances
表不包含这些列。 -
SUM_
xxx
对应
events_statements_current
表中相应的xxx
列的聚合。例如,语句摘要表中的SUM_LOCK_TIME
和SUM_ERRORS
列是events_statements_current
表中LOCK_TIME
和ERRORS
列的聚合。 -
MAX_CONTROLLED_MEMORY
报告语句执行期间使用的最大控制内存量。
-
MAX_TOTAL_MEMORY
报告语句执行期间使用的最大内存量。
-
COUNT_SECONDARY
查询在
SECONDARY
引擎上处理的次数。用于 MySQL HeatWave 服务和 HeatWave,wherePRIMARY
引擎是InnoDB
,SECONDARY
引擎是 HeatWave (RAPID
)。对于 MySQL Community Edition Server、MySQL Enterprise Edition Server(on-premise)和 MySQL HeatWave 服务无 HeatWave,查询总是处理在PRIMARY
引擎上,这意味着这些 MySQL 服务器上的值总是 0。
The events_statements_summary_by_digest
表还有这些额外的摘要列:
-
FIRST_SEEN
,LAST_SEEN
时间戳,指示具有给定摘要值的语句何时首次和最近被看到。
-
QUANTILE_95
:语句延迟的 95th 百分位数,以皮秒为单位。这是从 histogram 数据中计算的高估计值。换言之,对于给定的摘要,95% 的语句测量延迟低于QUANTILE_95
。要访问 histogram 数据,请使用 第 29.12.20.4 节,“语句 Histogram 摘要表” 中描述的表。
-
QUANTILE_99
:类似于QUANTILE_95
,但为 99th 百分位数。 -
QUANTILE_999
:类似于QUANTILE_95
,但为 99.9th 百分位数。
The events_statements_summary_by_digest
表包含以下列,这些列既不是分组列,也不是摘要列,而是支持语句采样:
-
QUERY_SAMPLE_TEXT
一个示例 SQL 语句,产生了该行中的摘要值。该列使应用程序能够访问,给定摘要值,服务器实际看到的语句。这可能用于在代表性语句上运行
EXPLAIN
,以检查关联语句的执行计划。当
QUERY_SAMPLE_TEXT
列被赋值时,QUERY_SAMPLE_SEEN
和QUERY_SAMPLE_TIMER_WAIT
列也将被赋值。默认情况下,语句显示的最大可用空间为 1024 字节。要更改此值,请在服务器启动时设置
performance_schema_max_sql_text_length
系统变量。(更改此值还会影响其他 Performance Schema 表中的列。请参阅 第 29.10 节,“Performance Schema 语句摘要和采样”。)有关语句采样的信息,请参阅 第 29.10 节,“Performance Schema 语句摘要和采样”。
-
QUERY_SAMPLE_SEEN
一个时间戳,指示
QUERY_SAMPLE_TEXT
列中的语句何时被看到。 -
QUERY_SAMPLE_TIMER_WAIT
在
QUERY_SAMPLE_TEXT
列中的样本语句的等待时间。
The events_statements_summary_by_program 表具有这些附加的摘要列:
-
COUNT_STATEMENTS
,SUM_STATEMENTS_WAIT
,MIN_STATEMENTS_WAIT
,AVG_STATEMENTS_WAIT
,MAX_STATEMENTS_WAIT
关于嵌套语句的统计信息,在存储程序执行期间被调用。
The prepared_statements_instances
表具有这些附加的摘要列:
-
COUNT_EXECUTE
,SUM_TIMER_EXECUTE
,MIN_TIMER_EXECUTE
,AVG_TIMER_EXECUTE
,MAX_TIMER_EXECUTE
关于准备语句执行的聚合统计信息。
语句摘要表具有这些索引:
-
events_transactions_summary_by_account_by_event_name
:-
主键在 (
USER
,HOST
,EVENT_NAME
)
-
-
events_statements_summary_by_digest
:-
主键在 (
SCHEMA_NAME
,DIGEST
)
-
-
events_transactions_summary_by_host_by_event_name
:-
主键在 (
HOST
,EVENT_NAME
)
-
-
events_statements_summary_by_program
:-
主键在 (
OBJECT_TYPE
,OBJECT_SCHEMA
,OBJECT_NAME
)
-
-
events_statements_summary_by_thread_by_event_name
:-
主键在 (
THREAD_ID
,EVENT_NAME
)
-
-
events_transactions_summary_by_user_by_event_name
:-
主键在 (
USER
,EVENT_NAME
)
-
-
events_statements_summary_global_by_event_name
:-
主键在 (
EVENT_NAME
)
-
TRUNCATE TABLE
在语句摘要表中是允许的。它具有以下效果:
-
对于
events_statements_summary_by_digest
, 它删除行。 -
对于其他不按账户、主机或用户聚合的摘要表,截断将摘要列重置为零,而不是删除行。
-
对于其他按账户、主机或用户聚合的摘要表,截断删除无连接的账户、主机或用户的行,并将摘要列重置为零。
此外,每个按账户、主机、用户或线程聚合的语句摘要表隐式地截断了依赖的连接表的截断,或者截断了events_statements_summary_global_by_event_name
。有关详细信息,请参阅第 29.12.8 节,“性能模式连接表”。
此外,截断events_statements_summary_by_digest
隐式地截断events_statements_histogram_by_digest
,截断events_statements_summary_global_by_event_name
隐式地截断events_statements_histogram_global
。
如果启用了 statements_digest
消费者,那么在语句完成时,将根据语句的 DIGEST
值聚合到events_statements_summary_by_digest
中。
-
如果
events_statements_summary_by_digest
行已经存在于语句的摘要值中,那么将语句的统计信息聚合到该行中。LAST_SEEN
列将被更新为当前时间。 -
如果没有行具有语句的摘要值,并且表不是满的,那么将创建一个新的行用于语句。
FIRST_SEEN
和LAST_SEEN
列将被初始化为当前时间。 -
如果没有行具有语句的摘要值,并且表是满的,那么将语句的统计信息添加到一个特殊的 “catch-all” 行中,具有
DIGEST
=NULL
,该行将被创建如果必要。如果行被创建,FIRST_SEEN
和LAST_SEEN
列将被初始化为当前时间。否则,LAST_SEEN
列将被更新为当前时间。
具有 DIGEST
= NULL
的行被维护,因为性能模式表具有最大大小限制。该行允许不匹配其他行的摘要被计数,即使摘要表是满的,使用一个共同的 “其他” 桶。这行有助于您估算摘要表的代表性:
-
具有
DIGEST
=NULL
行的COUNT_STAR
值代表所有摘要的 5%,表明摘要表非常具有代表性;其他行涵盖了 95% 的语句。 -
具有
DIGEST
=NULL
行的COUNT_STAR
值代表所有摘要的 50%,表明摘要表不太具有代表性;其他行只涵盖了半数的语句。可能 DBA 应该增加最大表大小,以便更多的行被计数在DIGEST
=NULL
行中,而不是使用更具体的行。默认情况下,表是自动调整大小的,但如果这个大小太小,可以在服务器启动时将performance_schema_digests_size
系统变量设置为更大的值。
对于在 setup_objects
表中启用了仪器的存储程序类型,events_statements_summary_by_program
按照以下方式维护存储程序的统计信息:
-
当对象首次在服务器中使用时,添加一行。
-
当对象被删除时,删除该对象的行。
-
随着对象的执行,统计信息将聚合到该对象的行中。