30.4.4.25 The statement_performance_analyzer() Procedure
创建服务器上运行的语句报告。视图是基于总体和/或delta活动计算的。
该过程在执行时禁用二进制日志记录,通过 manipulation 会话值 sql_log_bin
系统变量。该操作是受限制的,因此该过程需要具有设置受限制会话变量的权限。请参阅第7.1.9.1节,“系统变量权限”。
-
in_action ENUM('snapshot', 'overall', 'delta', 'create_tmp', 'create_table', 'save', 'cleanup')
: 要执行的操作。允许的值是:-
snapshot
: 存储快照。默认情况下,创建当前性能_schema events_statements_summary_by_digest 表的快照。通过设置in_table
,可以覆盖该快照的内容。快照将存储在sys
schematmp_digests
临时表中。 -
overall
: 生成基于in_table
指定的表的分析。对于总体分析,in_table
可以是NOW()
,以使用新的快照。这将覆盖现有快照。使用NULL
作为in_table
可以使用现有快照。如果in_table
是NULL
,并且没有快照存在,创建新的快照。in_views
参数和statement_performance_analyzer.limit
配置选项将影响该过程的操作。 -
delta
: 生成delta分析。delta 是在参考表指定的in_table
和快照之间计算的。这项操作使用sys
schematmp_digests_delta
临时表。in_views
参数和statement_performance_analyzer.limit
配置选项将影响该过程的操作。 -
create_table
: 创建一个适合存储快照的常规表(例如,用于计算delta)。 -
create_tmp
: 创建一个临时表适合存储快照(例如,用于计算delta)。 -
save
: 将快照保存到指定的表中。该表必须存在且具有正确的结构。如果没有快照存在,创建新的快照。 -
cleanup
: 删除用于快照和delta的临时表。
-
-
in_table VARCHAR(129)
: 表参数,用于某些由in_action
参数指定的操作。使用格式db_name.tbl_name
或tbl_name
,不使用任何反引号(`
)标识符引号字符。点(.
)不支持在数据库和表名中使用。每个
in_action
值的in_table
值的含义在各个in_action
值描述中详细介绍。 -
in_views SET ('with_runtimes_in_95th_percentile', 'analysis', 'with_errors_or_warnings', 'with_full_table_scans', 'with_sorting', 'with_temp_tables', 'custom')
: 包含哪些视图。这参数是一个SET
值,可以包含多个视图名,使用逗号分隔。默认情况下,包括所有视图,exceptcustom
。允许的值包括:-
with_runtimes_in_95th_percentile
: 使用statements_with_runtimes_in_95th_percentile
视图。 -
analysis
: 使用statement_analysis
视图。 -
with_errors_or_warnings
: 使用statements_with_errors_or_warnings
视图。 -
with_full_table_scans
: 使用statements_with_full_table_scans
视图。 -
with_sorting
: 使用statements_with_sorting
视图。 -
with_temp_tables
: 使用statements_with_temp_tables
视图。 -
custom
: 使用自定义视图。该视图必须使用statement_performance_analyzer.view
配置选项指定一个查询或现有视图。
-
statement_performance_analyzer()
操作可以使用以下配置选项或相应的用户定义变量(见Section 30.4.2.1, “The sys_config Table”):
-
debug
,@sys.debug
如果该选项设置为
ON
,则生成调试输出。默认情况下为OFF
。 -
statement_performance_analyzer.limit
,@sys.statement_performance_analyzer.limit
返回无限制视图的最大行数。默认情况下为100。
-
statement_performance_analyzer.view
,@sys.statement_performance_analyzer.view
自定义查询或视图。 如果选项值包含空格,则将其解释为查询。否则,它必须是对性能chema
events_statements_summary_by_digest
表的名称。不能在查询或视图定义中包含LIMIT
子句,如果statement_performance_analyzer.limit
配置选项大于0。指定视图时,使用与in_table
参数相同的格式。默认情况下为NULL
(无自定义视图定义)。
创建一个自定义报告,其中包含自上次截断以来的95%百分位数查询,自上次截断以来的delta时间为1分钟:
-
创建一个临时表来存储初始快照。
-
创建初始快照。
-
将初始快照保存到临时表中。
-
等待1分钟。
-
创建新的快照。
-
基于新的快照进行分析。
-
基于初始快照和新的快照之间的delta进行分析。
mysql> CALL sys.statement_performance_analyzer('create_tmp', 'mydb.tmp_digests_ini', NULL);
Query OK, 0 rows affected (0.08 sec)
mysql> CALL sys.statement_performance_analyzer('snapshot', NULL, NULL);
Query OK, 0 rows affected (0.02 sec)
mysql> CALL sys.statement_performance_analyzer('save', 'mydb.tmp_digests_ini', NULL);
Query OK, 0 rows affected (0.00 sec)
mysql> DO SLEEP(60);
Query OK, 0 rows affected (1 min 0.00 sec)
mysql> CALL sys.statement_performance_analyzer('snapshot', NULL, NULL);
Query OK, 0 rows affected (0.02 sec)
mysql> CALL sys.statement_performance_analyzer('overall', NULL, 'with_runtimes_in_95th_percentile');
+-----------------------------------------+
| Next Output |
+-----------------------------------------+
| Queries with Runtime in 95th Percentile |
+-----------------------------------------+
1 row in set (0.05 sec)
...
mysql> CALL sys.statement_performance_analyzer('delta', 'mydb.tmp_digests_ini', 'with_runtimes_in_95th_percentile');
+-----------------------------------------+
| Next Output |
+-----------------------------------------+
| Queries with Runtime in 95th Percentile |
+-----------------------------------------+
1 row in set (0.03 sec)
...
创建总体报告,包括95%百分位数查询和top 10查询中的全表扫描:
mysql> CALL sys.statement_performance_analyzer('snapshot', NULL, NULL);
Query OK, 0 rows affected (0.01 sec)
mysql> SET @sys.statement_performance_analyzer.limit = 10;
Query OK, 0 rows affected (0.00 sec)
mysql> CALL sys.statement_performance_analyzer('overall', NULL, 'with_runtimes_in_95th_percentile,with_full_table_scans');
+-----------------------------------------+
| Next Output |
+-----------------------------------------+
| Queries with Runtime in 95th Percentile |
+-----------------------------------------+
1 row in set (0.01 sec)
...
+-------------------------------------+
| Next Output |
+-------------------------------------+
| Top 10 Queries with Full Table Scan |
+-------------------------------------+
1 row in set (0.09 sec)
...
使用watch命令在Linux中每分钟刷新自定义视图,以显示总体报告中top 10查询按总执行时间排序:
mysql> CREATE OR REPLACE VIEW mydb.my_statements AS
SELECT sys.format_statement(DIGEST_TEXT) AS query,
SCHEMA_NAME AS db,
COUNT_STAR AS exec_count,
sys.format_time(SUM_TIMER_WAIT) AS total_latency,
sys.format_time(AVG_TIMER_WAIT) AS avg_latency,
ROUND(IFNULL(SUM_ROWS_SENT / NULLIF(COUNT_STAR, 0), 0)) AS rows_sent_avg,
ROUND(IFNULL(SUM_ROWS_EXAMINED / NULLIF(COUNT_STAR, 0), 0)) AS rows_examined_avg,
ROUND(IFNULL(SUM_ROWS_AFFECTED / NULLIF(COUNT_STAR, 0), 0)) AS rows_affected_avg,
DIGEST AS digest
FROM performance_schema.events_statements_summary_by_digest
ORDER BY SUM_TIMER_WAIT DESC;
Query OK, 0 rows affected (0.10 sec)
mysql> CALL sys.statement_performance_analyzer('create_table', 'mydb.digests_prev', NULL);
Query OK, 0 rows affected (0.10 sec)
$> watch -n 60 "mysql sys --table -e \"
> SET @sys.statement_performance_analyzer.view = 'mydb.my_statements';
> SET @sys.statement_performance_analyzer.limit = 10;
> CALL statement_performance_analyzer('snapshot', NULL, NULL);
> CALL statement_performance_analyzer('delta', 'mydb.digests_prev', 'custom');
> CALL statement_performance_analyzer('save', 'mydb.digests_prev', NULL);
> \""
Every 60.0s: mysql sys --table -e " ... Mon Dec 22 10:58:51 2014
+----------------------------------+
| Next Output |
+----------------------------------+
| Top 10 Queries Using Custom View |
+----------------------------------+
+-------------------+-------+------------+---------------+-------------+---------------+-------------------+-------------------+----------------------------------+
| query | db | exec_count | total_latency | avg_latency | rows_sent_avg | rows_examined_avg | rows_affected_avg | digest |
+-------------------+-------+------------+---------------+-------------+---------------+-------------------+-------------------+----------------------------------+
...