暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

课程笔记:通过系统性能视图找到top sql| MySQL8.0-性能优化系列

原创 晨辉 2022-08-25
1074

适用范围

操作系统:linux、windows
数据库版本:MySQL 8

概述

当mysql数据库在运行CPU使用率很高时,需要找到是什么SQL消耗了很多的CPU,下面就是本课程中介绍的系统性能视图来找到top sql的一种方法。

视图说明

1)sys.statement_analysis视图

这个视图已经根据SQL运行的总时间进行排序,直接查limit 1 就是执行时间累积最长的第1条SQL,limit 10就是累积时间最长的前10条SQL
如下查询,SELECT COUNT ( * ) FROM t , … WHERE t . id = t1 . id执行了95次,总时间为2.07min排在了第一位。

mysql> select * from sys.statement_analysis limit 3\G;
*************************** 1. row ***************************
            query: SELECT COUNT ( * ) FROM `t` ,  ... WHERE `t` . `id` = `t1` . `id`
               db: xhy
        full_scan: 
       exec_count: 95
        err_count: 0
       warn_count: 0
    total_latency: 2.07 min
      max_latency: 1.62 s
      avg_latency: 1.31 s
     lock_latency: 11.89 ms
        rows_sent: 95
    rows_sent_avg: 1
    rows_examined: 181789530
rows_examined_avg: 1913574
    rows_affected: 0
rows_affected_avg: 0
       tmp_tables: 0
  tmp_disk_tables: 0
      rows_sorted: 0
sort_merge_passes: 0
           digest: 0c73452dccafd67b38aeb4fbd7bdbca846fc0dc001603fd3824d4bcf4b159d8b
       first_seen: 2022-08-25 22:14:15.912862
        last_seen: 2022-08-25 22:17:27.768462
*************************** 2. row ***************************
            query: SELECT COUNT ( * ) FROM `t` ,  ... WHERE `t` . `id` > `t1` . `id`
               db: xhy
        full_scan: *
       exec_count: 1
        err_count: 1
       warn_count: 0
    total_latency: 2.00 min
      max_latency: 2.00 min
      avg_latency: 2.00 min
     lock_latency: 166.00 us
        rows_sent: 0
    rows_sent_avg: 0
    rows_examined: 233304279
rows_examined_avg: 233304279
    rows_affected: 0
rows_affected_avg: 0
       tmp_tables: 0
  tmp_disk_tables: 0
      rows_sorted: 0
sort_merge_passes: 0
           digest: 56e203adeb50c95984ff47329ee4ed5f0f3a43ed6b75e78ff56e2f77e719004b
       first_seen: 2022-08-25 22:13:59.527473
        last_seen: 2022-08-25 22:13:59.527473
*************************** 3. row ***************************
            query: SELECT COUNT ( * ) FROM `test` ... WHERE `t1` . `id` > `t` . `id`
               db: xhy
        full_scan: *
       exec_count: 4
        err_count: 1
       warn_count: 0
    total_latency: 1.35 min
      max_latency: 1.35 min
      avg_latency: 20.27 s
     lock_latency: 788.00 us
        rows_sent: 3
    rows_sent_avg: 1
    rows_examined: 967270
rows_examined_avg: 241818
    rows_affected: 0
rows_affected_avg: 0
       tmp_tables: 0
  tmp_disk_tables: 0
      rows_sorted: 0
sort_merge_passes: 0
           digest: 0922d0e3ec6a4f486f383ca8310188715763f3e1169c50e5341b676510125d13
       first_seen: 2022-08-25 21:54:22.490109
        last_seen: 2022-08-25 22:11:12.213559
3 rows in set (0.00 sec)

2)sys.statements_with_runtimes_in_95th_percentile视图

这个视图是根据平均时间取前5%的top sql信息。

mysql> select * from sys.statements_with_runtimes_in_95th_percentile\G;
*************************** 1. row ***************************
            query: SELECT COUNT ( * ) FROM `t` ,  ... WHERE `t` . `id` > `t1` . `id`
               db: xhy
        full_scan: *
       exec_count: 1
        err_count: 1
       warn_count: 0
    total_latency: 2.00 min
      max_latency: 2.00 min
      avg_latency: 2.00 min
        rows_sent: 0
    rows_sent_avg: 0
    rows_examined: 233304279
rows_examined_avg: 233304279
       first_seen: 2022-08-25 22:13:59.527473
        last_seen: 2022-08-25 22:13:59.527473
           digest: 56e203adeb50c95984ff47329ee4ed5f0f3a43ed6b75e78ff56e2f77e719004b
*************************** 2. row ***************************
            query: SELECT COUNT ( * ) FROM `test` ... WHERE `t1` . `id` > `t` . `id`
               db: xhy
        full_scan: *
       exec_count: 5
        err_count: 1
       warn_count: 0
    total_latency: 1.35 min
      max_latency: 1.35 min
      avg_latency: 16.22 s
        rows_sent: 4
    rows_sent_avg: 1
    rows_examined: 967270
rows_examined_avg: 193454
       first_seen: 2022-08-25 21:54:22.490109
        last_seen: 2022-08-25 22:24:22.899901
           digest: 0922d0e3ec6a4f486f383ca8310188715763f3e1169c50e5341b676510125d13
2 rows in set (0.01 sec)

ERROR: 
No query specified

3)performance_schema.events_statements_summary_by_digest视图

这个视图对相同语句进行了合并,主要的将常量替换成了 ?,并且有处理其平均执行时间,总的执行时间等统计信息

mysql> select * from performance_schema.events_statements_summary_by_digest order by avg_timer_wait desc limit 3\G;
*************************** 1. row ***************************
                SCHEMA_NAME: xhy
                     DIGEST: 56e203adeb50c95984ff47329ee4ed5f0f3a43ed6b75e78ff56e2f77e719004b
                DIGEST_TEXT: SELECT COUNT ( * ) FROM `t` , `t` `t1` WHERE `t` . `id` > `t1` . `id`
                 COUNT_STAR: 1
             SUM_TIMER_WAIT: 119803684332000
             MIN_TIMER_WAIT: 119803684332000
             AVG_TIMER_WAIT: 119803684332000
             MAX_TIMER_WAIT: 119803684332000
              SUM_LOCK_TIME: 166000000
                 SUM_ERRORS: 1
               SUM_WARNINGS: 0
          SUM_ROWS_AFFECTED: 0
              SUM_ROWS_SENT: 0
          SUM_ROWS_EXAMINED: 233304279
SUM_CREATED_TMP_DISK_TABLES: 0
     SUM_CREATED_TMP_TABLES: 0
       SUM_SELECT_FULL_JOIN: 0
 SUM_SELECT_FULL_RANGE_JOIN: 0
           SUM_SELECT_RANGE: 0
     SUM_SELECT_RANGE_CHECK: 1
            SUM_SELECT_SCAN: 1
      SUM_SORT_MERGE_PASSES: 0
             SUM_SORT_RANGE: 0
              SUM_SORT_ROWS: 0
              SUM_SORT_SCAN: 0
          SUM_NO_INDEX_USED: 1
     SUM_NO_GOOD_INDEX_USED: 1
                 FIRST_SEEN: 2022-08-25 22:13:59.527473
                  LAST_SEEN: 2022-08-25 22:13:59.527473
                QUANTILE_95: 120226443461744
                QUANTILE_99: 120226443461744
               QUANTILE_999: 120226443461744
          QUERY_SAMPLE_TEXT: NULL
          QUERY_SAMPLE_SEEN: 0000-00-00 00:00:00.000000
    QUERY_SAMPLE_TIMER_WAIT: 0
*************************** 2. row ***************************
                SCHEMA_NAME: xhy
                     DIGEST: 0922d0e3ec6a4f486f383ca8310188715763f3e1169c50e5341b676510125d13
                DIGEST_TEXT: SELECT COUNT ( * ) FROM `test` `t1` , `t` WHERE `t1` . `id` > `t` . `id`
                 COUNT_STAR: 5
             SUM_TIMER_WAIT: 81100294725000
             MIN_TIMER_WAIT: 269396000
             AVG_TIMER_WAIT: 16220058945000
             MAX_TIMER_WAIT: 81098191546000
              SUM_LOCK_TIME: 957000000
                 SUM_ERRORS: 1
               SUM_WARNINGS: 0
          SUM_ROWS_AFFECTED: 0
              SUM_ROWS_SENT: 4
          SUM_ROWS_EXAMINED: 967270
SUM_CREATED_TMP_DISK_TABLES: 0
     SUM_CREATED_TMP_TABLES: 0
       SUM_SELECT_FULL_JOIN: 1
 SUM_SELECT_FULL_RANGE_JOIN: 0
           SUM_SELECT_RANGE: 0
     SUM_SELECT_RANGE_CHECK: 4
            SUM_SELECT_SCAN: 5
      SUM_SORT_MERGE_PASSES: 0
             SUM_SORT_RANGE: 0
              SUM_SORT_ROWS: 0
              SUM_SORT_SCAN: 0
          SUM_NO_INDEX_USED: 5
     SUM_NO_GOOD_INDEX_USED: 4
                 FIRST_SEEN: 2022-08-25 21:54:22.490109
                  LAST_SEEN: 2022-08-25 22:24:22.899901
                QUANTILE_95: 83176377110269
                QUANTILE_99: 83176377110269
               QUANTILE_999: 83176377110269
          QUERY_SAMPLE_TEXT: SELECT COUNT(*) FROM test t1,t where t1.id>t.id
          QUERY_SAMPLE_SEEN: 2022-08-25 22:24:22.899901
    QUERY_SAMPLE_TIMER_WAIT: 376996000
*************************** 3. row ***************************
                SCHEMA_NAME: xhy
                     DIGEST: 6a7dede54bd8f9d1b48e17ef188043bb22cf14aae20d568262c9beafea5fbe13
                DIGEST_TEXT: SELECT COUNT ( * ) FROM `test` `t1` , `t` WHERE `t` . `a` = `t1` . `id` AND `t` . `a` <= ?
                 COUNT_STAR: 1
             SUM_TIMER_WAIT: 3694064664000
             MIN_TIMER_WAIT: 3694064664000
             AVG_TIMER_WAIT: 3694064664000
             MAX_TIMER_WAIT: 3694064664000
              SUM_LOCK_TIME: 95000000
                 SUM_ERRORS: 0
               SUM_WARNINGS: 0
          SUM_ROWS_AFFECTED: 0
              SUM_ROWS_SENT: 1
          SUM_ROWS_EXAMINED: 3145728
SUM_CREATED_TMP_DISK_TABLES: 0
     SUM_CREATED_TMP_TABLES: 0
       SUM_SELECT_FULL_JOIN: 0
 SUM_SELECT_FULL_RANGE_JOIN: 0
           SUM_SELECT_RANGE: 0
     SUM_SELECT_RANGE_CHECK: 0
            SUM_SELECT_SCAN: 1
      SUM_SORT_MERGE_PASSES: 0
             SUM_SORT_RANGE: 0
              SUM_SORT_ROWS: 0
              SUM_SORT_SCAN: 0
          SUM_NO_INDEX_USED: 1
     SUM_NO_GOOD_INDEX_USED: 0
                 FIRST_SEEN: 2022-08-25 21:43:19.757658
                  LAST_SEEN: 2022-08-25 21:43:19.757658
                QUANTILE_95: 3801893963205
                QUANTILE_99: 3801893963205
               QUANTILE_999: 3801893963205
          QUERY_SAMPLE_TEXT: select count(*) from test t1,t where t.a=t1.id and t.a<=10000
          QUERY_SAMPLE_SEEN: 2022-08-25 21:43:19.757658
    QUERY_SAMPLE_TIMER_WAIT: 3694064664000
mysql> 

总结

sys.statement_analysis、sys.statements_with_runtimes_in_95th_percentile、performance_schema.events_statements_summary_by_digest
这3个视图都是默认开启的,MySQL安装运行无需调整任何设置就生效的,通过这几个视图可以在无需修改客户任何配置的情况下获取top sql信息。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论