Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

MySQL 8.3 Reference Manual  /  ...  /  The statement_performance_analyzer() Procedure

30.4.4.25 语句性能分析器过程

创建服务器上运行的语句的报告。视图基于总体和/或增量活动计算。

该过程在执行期间通过操纵会话值的 sql_log_bin 系统变量来禁用二进制日志记录。这是一个受限的操作,因此该过程需要足够的权限来设置受限的会话变量。请参阅 第 7.1.9.1 节,“系统变量权限”

参数
  • in_action ENUM('snapshot', 'overall', 'delta', 'create_tmp', 'create_table', 'save', 'cleanup'): 要采取的操作。这些值是允许的:

    • snapshot: 存储快照。默认情况下,是在性能模式 events_statements_summary_by_digest 表的当前内容的快照。通过设置 in_table,可以覆盖到指定表的内容。快照将存储在 sys 模式 tmp_digests 临时表中。

    • overall: 根据指定表的内容生成分析。对于总体分析,in_table 可以是 NOW(),以使用最新的快照。这将覆盖现有的快照。使用 NULL 作为 in_table,以使用现有的快照。如果 in_tableNULL,且没有快照存在,则创建一个新的快照。in_views 参数和 statement_performance_analyzer.limit 配置选项会影响该过程的操作。

    • delta: 生成增量分析。增量是根据指定表和快照之间的差异计算的。这将使用 sys 模式 tmp_digests_delta 临时表。in_views 参数和 statement_performance_analyzer.limit 配置选项会影响该过程的操作。

    • create_table: 创建一个适合存储快照的常规表,以便后续使用(例如,计算增量)。

    • create_tmp: 创建一个适合存储快照的临时表,以便后续使用(例如,计算增量)。

    • save: 将快照保存到指定表中。该表必须存在并且具有正确的结构。如果没有快照存在,则创建一个新的快照。

    • cleanup: 删除用于快照和增量的临时表。

  • in_table VARCHAR(129): 用于某些 in_action 参数的表参数。使用格式 db_name.tbl_nametbl_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 值,因此可以包含多个视图名称,逗号分隔。默认情况下,包括所有视图,除了 custom。以下值是允许的:

配置选项

statement_performance_analyzer() 操作可以使用以下配置选项或相应的用户定义变量进行修改(见 第 30.4.2.1 节,“sys_config 表”):

  • debug, @sys.debug

    如果该选项为 ON,则生成调试输出。默认为 OFF

  • statement_performance_analyzer.limit, @sys.statement_performance_analyzer.limit

    返回视图的最大行数。如果该选项大于 0,则不能在查询或视图定义中包含 LIMIT 子句。默认为 100。

  • statement_performance_analyzer.view, @sys.statement_performance_analyzer.view

    要使用的自定义查询或视图。如果该选项值包含空格,则解释为查询。否则,必须是现有视图的名称,该视图查询 Performance Schema events_statements_summary_by_digest 表。默认为 NULL(无自定义视图定义)。

示例

要创建一个报告,显示自上次截断 events_statements_summary_by_digest 以来的 95th 百分位查询,并且具有一个分钟的 delta 期间:

  1. 创建一个临时表来存储初始快照。

  2. 创建初始快照。

  3. 将初始快照保存在临时表中。

  4. 等待一分钟。

  5. 创建一个新的快照。

  6. 基于新的快照执行分析。

  7. 基于初始和新的快照之间的 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)

...

创建一个总体报告,显示 95th 百分位查询和前 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)

...

使用一个自定义视图,显示按总执行时间排序的前 10 个查询,每分钟刷新视图一次,使用 Linux 的 watch 命令:

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                           |
+-------------------+-------+------------+---------------+-------------+---------------+-------------------+-------------------+----------------------------------+
...