语句效率统计视图 | 全方位认识 sys 系统库

限时加码!20+主流AI编程工具免费用 购周边加赠Coding Plan Lite,Claude Code、Cursor等即刻畅享,学习进阶更高效! 阅读详情

在上一篇《统计信息查询视图|全方位认识 sys 系统库》中,我们介绍了利用sys 系统库的查询统计信息的快捷视图,本期将为大家介绍语句查询效率语句统计信息相关的视图,这些视图可以快速找出数据库中哪些语句使用了全表扫描、哪些语句使用了文件排序、哪些语句使用了临时表。

PS:由于本文中所提及的视图功能的特殊性(DBA日常工作中可能需要查询一些信息做一些数据分析使用),所以下文中会列出部分视图中的select语句文本,以便大家更直观地学习。

01

schema_tables_with_full_table_scans,x$schema_tables_with_full_table_scans

查询执行过全扫描访问的表,默认情况下按照表扫描的行数进行降序排序。数据来源:performance_schema.table_io_waits_summary_by_index_usage

视图查询语句文本

SELECT object_schema,
  object_name,
  count_read AS rows_full_scanned,
  sys.format_time(sum_timer_wait) AS latency
FROM performance_schema.table_io_waits_summary_by_index_usage
WHERE index_name IS NULL
AND count_read > 0
ORDER BY count_read DESC;

下面我们看看使用该视图查询返回的结果

# 不带x$前缀的视图
admin@localhost : sys 12:39:48> select * from schema_tables_with_full_table_scans limit 3;
+---------------+-------------+-------------------+---------+
| object_schema | object_name | rows_full_scanned | latency |
+---------------+-------------+-------------------+---------+
| sbtest        | sbtest1    |          16094049 | 24.80 s |
+---------------+-------------+-------------------+---------+
1 row in set (0.00 sec)

# 带x$前缀的视图
admin@localhost : sys 12:39:52> select * from x$schema_tables_with_full_table_scans limit 3;
+---------------+-------------+-------------------+----------------+
| object_schema | object_name | rows_full_scanned | latency        |
+---------------+-------------+-------------------+----------------+
| sbtest        | sbtest1    |          16094049 | 24795682856625 |
+---------------+-------------+-------------------+----------------+
1 row in set (0.00 sec)

视图字段含义如下:

  • object_schema:schema名称

  • OBJECT_NAME:表名

  • rows_full_scanned:全表扫描的总数据行数

  • latency:完整的表扫描操作的总延迟时间(执行时间)

02

statement_analysis,x$statement_analysis

查看语句汇总统计信息,这些视图模仿MySQL企业版监控的查询分析视图列出语句的聚合统计信息,默认情况下按照总延迟时间(执行时间)降序排序。数据来源:performance_schema.events_statements_summary_by_digest

视图查询语句文本

SELECT sys.format_statement(DIGEST_TEXT) AS query,
  SCHEMA_NAME AS db,
  IF(SUM_NO_GOOD_INDEX_USED > 0 OR SUM_NO_INDEX_USED > 0, '*', '') AS full_scan,
  COUNT_STAR AS exec_count,
  SUM_ERRORS AS err_count,
  SUM_WARNINGS AS warn_count,
  sys.format_time(SUM_TIMER_WAIT) AS total_latency,
  sys.format_time(MAX_TIMER_WAIT) AS max_latency,
  sys.format_time(AVG_TIMER_WAIT) AS avg_latency,
  sys.format_time(SUM_LOCK_TIME) AS lock_latency,
  SUM_ROWS_SENT AS rows_sent,
  ROUND(IFNULL(SUM_ROWS_SENT / NULLIF(COUNT_STAR, 0), 0)) AS rows_sent_avg,
  SUM_ROWS_EXAMINED AS rows_examined,
  ROUND(IFNULL(SUM_ROWS_EXAMINED / NULLIF(COUNT_STAR, 0), 0))  AS rows_examined_avg,
  SUM_ROWS_AFFECTED AS rows_affected,
  ROUND(IFNULL(SUM_ROWS_AFFECTED / NULLIF(COUNT_STAR, 0), 0))  AS rows_affected_avg,
  SUM_CREATED_TMP_TABLES AS tmp_tables,
  SUM_CREATED_TMP_DISK_TABLES AS tmp_disk_tables,
  SUM_SORT_ROWS AS rows_sorted,
  SUM_SORT_MERGE_PASSES AS sort_merge_passes,
  DIGEST AS digest,
  FIRST_SEEN AS first_seen,
  LAST_SEEN as last_seen
FROM performance_schema.events_statements_summary_by_digest
ORDER BY SUM_TIMER_WAIT DESC;

下面我们看看使用该视图查询返回的结果

# 不带x$前缀的视图
admin@localhost : sys 12:46:07> select * from statement_analysis limit 1\G
*************************** 1. row ***************************
        query: ALTER TABLE `test` ADD INDEX `i_k` ( `test` ) 
          db: xiaoboluo
    full_scan: 
  exec_count: 2
    err_count: 2
  warn_count: 0
total_latency: 56.56 m
  max_latency: 43.62 m
  avg_latency: 28.28 m
lock_latency: 0 ps
    rows_sent: 0
rows_sent_avg: 0
rows_examined: 0
rows_examined_avg: 0
rows_affected: 0
rows_affected_avg: 0
  tmp_tables: 0
tmp_disk_tables: 0
  rows_sorted: 0
sort_merge_passes: 0
      digest: f359a4a8407ee79ea1d84480fdd04f62
  first_seen: 2017-09-07 11:44:35
    last_seen: 2017-09-07 12:36:47
1 row in set (0.14 sec)

# 带x$前缀的视图
admin@localhost : sys 12:46:34> select * from x$statement_analysis limit 1\G;
*************************** 1. row ***************************
        query: ALTER TABLE `test` ADD INDEX `i_k` ( `test` ) 
          db: xiaoboluo
    full_scan: 
  exec_count: 2
    err_count: 2
  warn_count: 0
total_latency: 3393877088372000
  max_latency: 2617456143674000
  avg_latency: 1696938544186000
lock_latency: 0
    rows_sent: 0
rows_sent_avg: 0
rows_examined: 0
rows_examined_avg: 0
rows_affected: 0
rows_affected_avg: 0
  tmp_tables: 0
tmp_disk_tables: 0
  rows_sorted: 0
sort_merge_passes: 0
      digest: f359a4a8407ee79ea1d84480fdd04f62
  first_seen: 2017-09-07 11:44:35
    last_seen: 2017-09-07 12:36:47
1 row in set (0.01 sec)

视图字段含义如下:

  • query:经过标准化转换的语句字符串,不带x$的视图默认长度限制为64字节,带x$的视图默认长度限制为1024字节

  • db:语句对应的默认数据库,如果没有默认数据库,该字段为NULL

  • full_scan:语句全表扫描查询的总次数

  • exec_count:语句执行的总次数

  • err_count:语句发生的错误总次数

  • warn_count:语句发生的警告总次数

  • total_latency:语句的总延迟时间(执行时间)

  • max_latency:单个语句的最大延迟时间(执行时间)

  • avg_latency:每个语句的平均延迟时间(执行时间)

  • lock_latency:语句的总锁等待时间

  • rows_sent:语句返回客户端的总数据行数

  • rows_sent_avg:每个语句返回客户端的平均数据行数

  • rows_examined:语句从存储引擎读取的总数据数

  • rows_examined_avg:每个语句从存储引擎检查的平均数据行数

  • rows_affected:语句影响的总数据行数

  • rows_affected_avg:每个语句影响的平均数据行数

  • tmp_tables:语句执行时创建的内部内存临时表的总数

  • tmp_disk_tables:语句执行时创建的内部磁盘临时表的总数

  • rows_sorted:语句执行时出现排序的总数据行数

  • sort_merge_passes:语句执行时出现排序合并的总次数

  • digest:语句摘要计算的md5 hash值

  • first_seen:该语句第一次出现的时间

  • last_seen:该语句最近一次出现的时间

03

statements_with_errors_or_warnings,x$statements_with_errors_or_warnings

查看产生错误或警告的语句,默认情况下,按照错误数量和警告数量降序排序。数据来源:performance_schema.events_statements_summary_by_digest

  • PS:这里大家注意了,语法错误或者产生警告的语句通常错误日志中不记录,慢查询日志中也不记录,只有查询日志中会记录所有的语句,但不携带语句执行状态的信息,所以无法判断是否是执行有错误或者有警告的语句,通过该视图可以查询到语句执行的状态信息,以后开发执行了某个语句有语法错误来问你想查看具体的语句文本的时候,别再说MySQL不支持查看啦。

视图查询语句文本

SELECT sys.format_statement(DIGEST_TEXT) AS query,
  SCHEMA_NAME as db,
  COUNT_STAR AS exec_count,
  SUM_ERRORS AS errors,
  IFNULL(SUM_ERRORS / NULLIF(COUNT_STAR, 0), 0) * 100 as error_pct,
  SUM_WARNINGS AS warnings,
  IFNULL(SUM_WARNINGS / NULLIF(COUNT_STAR, 0), 0) * 100 as warning_pct,
  FIRST_SEEN as first_seen,
  LAST_SEEN as last_seen,
  DIGEST AS digest
FROM performance_schema.events_statements_summary_by_digest
WHERE SUM_ERRORS > 0
OR SUM_WARNINGS > 0
ORDER BY SUM_ERRORS DESC, SUM_WARNINGS DESC;

下面我们看看使用该视图查询返回的结果

# 不带x$前缀的视图
admin@localhost : sys 12:47:36> select * from statements_with_errors_or_warnings limit 1\G
*************************** 1. row ***************************
  query: SELECT * FROM `test` LIMIT ? FOR UPDATE 
    db: xiaoboluo
exec_count: 5
errors: 3
error_pct: 60.0000
warnings: 0
warning_pct: 0.0000
first_seen: 2017-09-07 11:29:44
last_seen: 2017-09-07 12:45:58
digest: 9f50f1fc79fc6ea678dec6576b7d7faa
1 row in set (0.00 sec)

# 带x$前缀的视图
admin@localhost : sys 12:47:45> select * from x$statements_with_errors_or_warnings limit 1\G;
*************************** 1. row ***************************
  query: SELECT * FROM `test` LIMIT ? FOR UPDATE 
    db: xiaoboluo
exec_count: 5
errors: 3
error_pct: 60.0000
warnings: 0
warning_pct: 0.0000
first_seen: 2017-09-07 11:29:44
last_seen: 2017-09-07 12:45:58
digest: 9f50f1fc79fc6ea678dec6576b7d7faa
1 row in set (0.00 sec)

视图字段含义如下:

  • query:经过标准化转换的语句字符串

  • db:语句对应的默认数据库,如果没有默认数据库,该字段为NULL

  • exec_count:语句执行的总次数

  • errors:语句发生的错误总次数

  • error_pct:语句产生错误的次数与语句总执行次数的百分比

  • warnings:语句发生的警告总次数

  • warning_pct:语句产生警告的与语句总执行次数的百分比

  • first_seen:该语句第一次出现的时间

  • last_seen:该语句最近一次出现的时间

  • digest:语句摘要计算的md5 hash值

04

statements_with_full_table_scans,x$statements_with_full_table_scans

查看全表扫描或者没有使用到最优索引的语句(经过标准化转化的语句文本),默认情况下按照全表扫描次数与语句总次数百分比和语句总延迟时间(执行时间)降序排序。数据来源:performance_schema.events_statements_summary_by_digest

视图查询语句文本

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,
  SUM_NO_INDEX_USED AS no_index_used_count,
  SUM_NO_GOOD_INDEX_USED AS no_good_index_used_count,
  ROUND(IFNULL(SUM_NO_INDEX_USED / NULLIF(COUNT_STAR, 0), 0) * 100) AS no_index_used_pct,
  SUM_ROWS_SENT AS rows_sent,
  SUM_ROWS_EXAMINED AS rows_examined,
  ROUND(SUM_ROWS_SENT/COUNT_STAR) AS rows_sent_avg,
  ROUND(SUM_ROWS_EXAMINED/COUNT_STAR) AS rows_examined_avg,
  FIRST_SEEN as first_seen,
  LAST_SEEN as last_seen,
  DIGEST AS digest
FROM performance_schema.events_statements_summary_by_digest
WHERE (SUM_NO_INDEX_USED > 0
OR SUM_NO_GOOD_INDEX_USED > 0)
AND DIGEST_TEXT NOT LIKE 'SHOW%'
ORDER BY no_index_used_pct DESC, total_latency DESC;

下面我们看看使用该视图查询返回的结果

# 不带x$前缀的视图
admin@localhost : sys 12:51:27> select * from statements_with_full_table_scans limit 1\G
*************************** 1. row ***************************
              query: SELECT `performance_schema` .  ... ance` . `SUM_TIMER_WAIT` DESC 
                  db: sys
          exec_count: 1
      total_latency: 938.45 us
no_index_used_count: 1
no_good_index_used_count: 0
  no_index_used_pct: 100
          rows_sent: 3
      rows_examined: 318
      rows_sent_avg: 3
  rows_examined_avg: 318
          first_seen: 2017-09-07 09:34:12
          last_seen: 2017-09-07 09:34:12
              digest: 5b5b4e15a8703769d9b9e23e9e92d499
1 row in set (0.01 sec)

# 带x$前缀的视图,要注意:从这里可以明显看到带x$的视图的query字段值较长,\
该长度受系统变量performance_schema_max_digest_length的值控制,默认为1024字节,\
而不带x$的视图该字段进一步使用了sys.format_statement()函数进行截断,\
该函数的截断长度限制受sys.sys_config配置表中的statement_truncate_len 配置值控制,默认值为64字节。\
所以,你会看到对于query语句文本,两者的输出长度有很大差别,如果你需要通过这些文本来甄别语句,那么请留意这个差异
admin@localhost : sys 12:51:36> select * from x$statements_with_full_table_scans limit 1\G;
*************************** 1. row ***************************
              query: SELECT IF ( ( `locate` ( ? , `ibp` . `TABLE_NAME` ) = ? ) , ? , REPLACE ( `substring_index` ( `ibp` . `TABLE_NAME` , ?, ... ) , ?, ... ) ) AS `object_schema` , REPLACE ( `substring_index`\
( `ibp` . `TABLE_NAME` , ? , - (?) ) , ?, ... ) AS `object_name` , SUM ( IF ( ( `ibp` . `COMPRESSED_SIZE` = ? ) , ? , `ibp` . `COMPRESSED_SIZE` ) ) AS `allocated` , SUM ( `ibp` . `DATA_SIZE` ) AS `data` , \
COUNT ( `ibp` . `PAGE_NUMBER` ) AS `pages` , COUNT ( IF ( ( `ibp` . `IS_HASHED` = ? ) , ?, ... ) ) AS `pages_hashed` , COUNT ( IF ( ( `ibp` . `IS_OLD` = ? ) , ?, ... ) ) AS `pages_old` , `round` ( `ifnull` ( ( SUM\
( `ibp` . `NUMBER_RECORDS` ) / `nullif` ( COUNT ( DISTINCTROW `ibp` . `INDEX_NAME` ) , ? ) ) , ? ) , ? ) AS `rows_cached` FROM `information_schema` . `innodb_buffer_page` `ibp` WHERE\
 ( `ibp` . `TABLE_NAME` IS NOT NULL ) GROUP BY `object_schema` , `object_name` ORDER BY SUM ( IF ( ( `ibp` . `COMPRESSED_SIZE` = ? ) , ? , `ibp` . `COMPRESSED_SIZE` ) ) DESC 
                  db: sys
          exec_count: 4
      total_latency: 46527032553000
no_index_used_count: 4
no_good_index_used_count: 0
  no_index_used_pct: 100
          rows_sent: 8
      rows_examined: 942517
      rows_sent_avg: 2
  rows_examined_avg: 235629
          first_seen: 2017-09-07 12:36:58
          last_seen: 2017-09-07 12:38:37
              digest: 59abe341d11b5307fbd8419b0b9a7bc3
1 row in set (0.00 sec)

视图字段含义如下:

  • query:经过标准化转换的语句字符串

  • db:语句对应的默认数据库,如果没有默认数据库,该字段为NULL

  • exec_count:语句执行的总次数

  • total_latency:语句执行的总延迟时间(执行时间)

  • no_index_used_count:语句执行没有使用索引扫描表(而是使用全表扫描)的总次数

  • no_good_index_used_count:语句执行没有使用到更好的索引扫描表的总次数

  • no_index_used_pct:语句执行没有使用索引扫描表(而是使用全表扫描)的次数与语句执行总次数的百分比

  • rows_sent:语句执行从表返回给客户端的总数据行数

  • rows_examined:语句执行从存储引擎检查的总数据行数

  • rows_sent_avg:每个语句执行从表中返回客户端的平均数据行数

  • rows_examined_avg:每个语句执行从存储引擎读取的平均数据行数

  • first_seen:该语句第一次出现的时间

  • last_seen:该语句最近一次出现的时间

  • digest:语句摘要计算的md5 hash值

05

statements_with_runtimes_in_95th_percentile,x$statements_with_runtimes_in_95th_percentile

查看平均执行时间值大于95%的平均执行时间的语句(可近似地认为是平均执行时间超长的语句),默认情况下按照语句平均延迟(执行时间)降序排序。数据来源:performance_schema.events_statements_summary_by_digest、sys.x$ps_digest_95th_percentile_by_avg_us

  • 两个视图都使用两个辅助视图sys.x$ps_digest_avg_latency_distribution和sys.x$ps_digest_95th_percentile_by_avg_us 
    * x$ps_digest_avg_latency_distribution视图对performance_schema.events_statements_summary_by_digest表中的avg_timer_wait列转换为微秒单位,然后使用round()函数以微秒为单位转换为整型值并命名为avg_us列,根据avg_us分组并使用count()统计行数并命名为cnt列 
    x$ps_digest_95th_percentile_by_avg_us视图在内部通过调用两个(两次)x$ps_digest_avg_latency_distribution视图形成联结表查询形式,使用联结条件ON s1.avg_us <= s2.avg_us的形式,按照s2.avg_us分组,并根据SUM(s1.cnt)/select COUNT()...performance_schema.events_statements_summary_by_digest > 0.95进行having分组后再过滤,实际上该视图最终返回的是每个语句平均执行时间相对于整个performance_schema.events_statements_summary_by_digest表统计值的直方图 
    * statements_with_runtimes_in_95th_percentile,x$statements_with_runtimes_in_95th_percentile视图内部再次调用x$ps_digest_95th_percentile_by_avg_us视图与performance_schema.events_statements_summary_by_digest表联结打印直方图分布值大于0.95的performance_schema.events_statements_summary_by_digest表中的原始统计信息

视图查询语句文本

SELECT sys.format_statement(DIGEST_TEXT) AS query,
  SCHEMA_NAME as db,
  IF(SUM_NO_GOOD_INDEX_USED > 0 OR SUM_NO_INDEX_USED > 0, '*', '') AS full_scan,
  COUNT_STAR AS exec_count,
  SUM_ERRORS AS err_count,
  SUM_WARNINGS AS warn_count,
  sys.format_time(SUM_TIMER_WAIT) AS total_latency,
  sys.format_time(MAX_TIMER_WAIT) AS max_latency,
  sys.format_time(AVG_TIMER_WAIT) AS avg_latency,
  SUM_ROWS_SENT AS rows_sent,
  ROUND(IFNULL(SUM_ROWS_SENT / NULLIF(COUNT_STAR, 0), 0)) AS rows_sent_avg,
  SUM_ROWS_EXAMINED AS rows_examined,
  ROUND(IFNULL(SUM_ROWS_EXAMINED / NULLIF(COUNT_STAR, 0), 0)) AS rows_examined_avg,
  FIRST_SEEN AS first_seen,
  LAST_SEEN AS last_seen,
  DIGEST AS digest
FROM performance_schema.events_statements_summary_by_digest stmts
JOIN sys.x$ps_digest_95th_percentile_by_avg_us AS top_percentile
ON ROUND(stmts.avg_timer_wait/1000000) >= top_percentile.avg_us
ORDER BY AVG_TIMER_WAIT DESC;

下面我们看看使用该视图查询返回的结果

# 不带x$前缀的视图
admin@localhost : sys 12:53:06> select * from statements_with_runtimes_in_95th_percentile limit 1\G
*************************** 1. row ***************************
        query: ALTER TABLE `test` ADD INDEX `i_k` ( `test` ) 
          db: xiaoboluo
    full_scan: 
  exec_count: 2
    err_count: 2
  warn_count: 0
total_latency: 56.56 m
  max_latency: 43.62 m
  avg_latency: 28.28 m
    rows_sent: 0
rows_sent_avg: 0
rows_examined: 0
rows_examined_avg: 0
  first_seen: 2017-09-07 11:44:35
    last_seen: 2017-09-07 12:36:47
      digest: f359a4a8407ee79ea1d84480fdd04f62
1 row in set (0.01 sec)

# 带x$前缀的视图
admin@localhost : sys 12:53:10> select * from x$statements_with_runtimes_in_95th_percentile limit 1\G;
*************************** 1. row ***************************
        query: ALTER TABLE `test` ADD INDEX `i_k` ( `test` ) 
          db: xiaoboluo
    full_scan: 
  exec_count: 2
    err_count: 2
  warn_count: 0
total_latency: 3393877088372000
  max_latency: 2617456143674000
  avg_latency: 1696938544186000
    rows_sent: 0
rows_sent_avg: 0
rows_examined: 0
rows_examined_avg: 0
  first_seen: 2017-09-07 11:44:35
    last_seen: 2017-09-07 12:36:47
      digest: f359a4a8407ee79ea1d84480fdd04f62
1 row in set (0.01 sec)

视图字段含义如下:

  • query:经过标准化转换的语句字符串

  • db:语句对应的默认数据库,如果没有默认数据库,该字段为NULL

  • full_scan:语句全表扫描查询的总次数

  • exec_count:语句执行的总次数

  • err_count:语句发生的错误总次数

  • warn_count:语句发生的警告总次数

  • total_latency:语句执行的总延迟时间(执行时间)

  • max_latency:单个语句的最大延迟时间(执行时间)

  • avg_latency:每个语句的平均延迟时间(执行时间)

  • rows_sent:语句执行从表返回给客户端的总数据行数

  • rows_sent_avg:每个语句执行从表中返回客户端的平均数据行数

  • rows_examined:语句执行从存储引擎检查的总数据行数

  • rows_examined_avg:每个语句执行从存储引擎检查的平均数据行数

  • first_seen:该语句第一次出现的时间

  • last_seen:该语句最近一次出现的时间

  • digest:语句摘要计算的md5 hash值

06

statements_with_sorting,x$statements_with_sorting

查看执行了文件排序的语句,默认情况下按照语句总延迟时间(执行时间)降序排序,数据来源:performance_schema.events_statements_summary_by_digest

视图查询语句文本

SELECT sys.format_statement(DIGEST_TEXT) AS query,
  SCHEMA_NAME db,
  COUNT_STAR AS exec_count,
  sys.format_time(SUM_TIMER_WAIT) AS total_latency,
  SUM_SORT_MERGE_PASSES AS sort_merge_passes,
  ROUND(IFNULL(SUM_SORT_MERGE_PASSES / NULLIF(COUNT_STAR, 0), 0)) AS avg_sort_merges,
  SUM_SORT_SCAN AS sorts_using_scans,
  SUM_SORT_RANGE AS sort_using_range,
  SUM_SORT_ROWS AS rows_sorted,
  ROUND(IFNULL(SUM_SORT_ROWS / NULLIF(COUNT_STAR, 0), 0)) AS avg_rows_sorted,
  FIRST_SEEN as first_seen,
  LAST_SEEN as last_seen,
  DIGEST AS digest
FROM performance_schema.events_statements_summary_by_digest
WHERE SUM_SORT_ROWS > 0
ORDER BY SUM_TIMER_WAIT DESC;

下面我们看看使用该视图查询返回的结果

# 不带x$前缀的视图
admin@localhost : sys 12:53:16> select * from statements_with_sorting limit 1\G
*************************** 1. row ***************************
        query: SELECT IF ( ( `locate` ( ? , ` ...  . `COMPRESSED_SIZE` ) ) DESC 
          db: sys
  exec_count: 4
total_latency: 46.53 s
sort_merge_passes: 48
avg_sort_merges: 12
sorts_using_scans: 16
sort_using_range: 0
  rows_sorted: 415391
avg_rows_sorted: 103848
  first_seen: 2017-09-07 12:36:58
    last_seen: 2017-09-07 12:38:37
      digest: 59abe341d11b5307fbd8419b0b9a7bc3
1 row in set (0.00 sec)

# 带x$前缀的视图
admin@localhost : sys 12:53:35> select * from x$statements_with_sorting limit 1\G;
*************************** 1. row ***************************
        query: SELECT IF ( ( `locate` ( ? , `ibp` . `TABLE_NAME` ) = ? ) , ? , REPLACE ( `substring_index` ( `ibp` . `TABLE_NAME` , ?, ... ) , ?, ... ) ) AS `object_schema` , REPLACE ( `substring_index` \
( `ibp` . `TABLE_NAME` , ? , - (?) ) , ?, ... ) AS `object_name` , SUM ( IF ( ( `ibp` . `COMPRESSED_SIZE` = ? ) , ? , `ibp` . `COMPRESSED_SIZE` ) ) AS `allocated` , SUM ( `ibp` . `DATA_SIZE` ) AS `data` , \
COUNT ( `ibp` . `PAGE_NUMBER` ) AS `pages` , COUNT ( IF ( ( `ibp` . `IS_HASHED` = ? ) , ?, ... ) ) AS `pages_hashed` , COUNT ( IF ( ( `ibp` . `IS_OLD` = ? ) , ?, ... ) ) AS `pages_old` , `round` \
( `ifnull` ( ( SUM ( `ibp` . `NUMBER_RECORDS` ) / `nullif` ( COUNT ( DISTINCTROW `ibp` . `INDEX_NAME` ) , ? ) ) , ? ) , ? ) AS `rows_cached` FROM `information_schema` . `innodb_buffer_page` `ibp` WHERE \
( `ibp` . `TABLE_NAME` IS NOT NULL ) GROUP BY `object_schema` , `object_name` ORDER BY SUM ( IF ( ( `ibp` . `COMPRESSED_SIZE` = ? ) , ? , `ibp` . `COMPRESSED_SIZE` ) ) DESC 
          db: sys
  exec_count: 4
total_latency: 46527032553000
sort_merge_passes: 48
avg_sort_merges: 12
sorts_using_scans: 16
sort_using_range: 0
  rows_sorted: 415391
avg_rows_sorted: 103848
  first_seen: 2017-09-07 12:36:58
    last_seen: 2017-09-07 12:38:37
      digest: 59abe341d11b5307fbd8419b0b9a7bc3
1 row in set (0.00 sec)

视图字段含义如下:

  • query:经过标准化转换的语句字符串

  • db:语句对应的默认数据库,如果没有默认数据库,该字段为NULL

  • exec_count:语句执行的总次数

  • total_latency:语句执行的总延迟时间(执行时间)

  • sort_merge_passes:语句执行发生的语句排序合并的总次数

  • avg_sort_merges:针对发生排序合并的语句,每个语句的平均排序合并次数(SUM_SORT_MERGE_PASSES/COUNT_STAR)

  • sorts_using_scans:语句排序执行全表扫描的总次数

  • sort_using_range:语句排序执行范围扫描的总次数

  • rows_sorted:语句执行发生排序的总数据行数

  • avg_rows_sorted:针对发生排序的语句,每个语句的平均排序数据行数(SUM_SORT_ROWS/COUNT_STAR)

  • first_seen:该语句第一次出现的时间

  • last_seen:该语句最近一次出现的时间

  • digest:语句摘要计算的md5 hash值

07

statements_with_temp_tables,x$statements_with_temp_tables

查看使用了临时表的语句,默认情况下按照磁盘临时表数量和内存临时表数量进行降序排序。数据来源:performance_schema.events_statements_summary_by_digest

视图查询语句文本

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,
  SUM_CREATED_TMP_TABLES AS memory_tmp_tables,
  SUM_CREATED_TMP_DISK_TABLES AS disk_tmp_tables,
  ROUND(IFNULL(SUM_CREATED_TMP_TABLES / NULLIF(COUNT_STAR, 0), 0)) AS avg_tmp_tables_per_query,
  ROUND(IFNULL(SUM_CREATED_TMP_DISK_TABLES / NULLIF(SUM_CREATED_TMP_TABLES, 0), 0) * 100) AS tmp_tables_to_disk_pct,
  FIRST_SEEN as first_seen,
  LAST_SEEN as last_seen,
  DIGEST AS digest
FROM performance_schema.events_statements_summary_by_digest
WHERE SUM_CREATED_TMP_TABLES > 0
ORDER BY SUM_CREATED_TMP_DISK_TABLES DESC, SUM_CREATED_TMP_TABLES DESC;

下面我们看看使用该视图查询返回的结果

# 不带x$前缀的视图
admin@localhost : sys 12:54:26> select * from statements_with_temp_tables limit 1\G
*************************** 1. row ***************************
              query: SELECT `performance_schema` .  ... name` . `SUM_TIMER_WAIT` DESC 
                  db: sys
          exec_count: 2
      total_latency: 1.53 s
  memory_tmp_tables: 458
    disk_tmp_tables: 38
avg_tmp_tables_per_query: 229
tmp_tables_to_disk_pct: 8
          first_seen: 2017-09-07 11:18:31
          last_seen: 2017-09-07 11:19:43
              digest: 6f58edd9cee71845f592cf5347f8ecd7
1 row in set (0.00 sec)

# 带x$前缀的视图
admin@localhost : sys 12:54:28> select * from x$statements_with_temp_tables limit 1\G;
*************************** 1. row ***************************
              query: SELECT `performance_schema` . `events_waits_summary_global_by_event_name` . `EVENT_NAME` AS `events` , `performance_schema` . `events_waits_summary_global_by_event_name` . \
`COUNT_STAR` AS `total` , `performance_schema` . `events_waits_summary_global_by_event_name` . `SUM_TIMER_WAIT` AS `total_latency` , `performance_schema` . \
`events_waits_summary_global_by_event_name` . `AVG_TIMER_WAIT` AS `avg_latency` , `performance_schema` . `events_waits_summary_global_by_event_name` . `MAX_TIMER_WAIT` AS `max_latency` \
FROM `performance_schema` . `events_waits_summary_global_by_event_name` WHERE ( ( `performance_schema` . `events_waits_summary_global_by_event_name` . `EVENT_NAME` != ? ) AND\
( `performance_schema` . `events_waits_summary_global_by_event_name` . `SUM_TIMER_WAIT` > ? ) ) ORDER BY `performance_schema` . `events_waits_summary_global_by_event_name` . \
`SUM_TIMER_WAIT` DESC 
                  db: sys
          exec_count: 2
      total_latency: 1529225370000
  memory_tmp_tables: 458
    disk_tmp_tables: 38
avg_tmp_tables_per_query: 229
tmp_tables_to_disk_pct: 8
          first_seen: 2017-09-07 11:18:31
          last_seen: 2017-09-07 11:19:43
              digest: 6f58edd9cee71845f592cf5347f8ecd7
1 row in set (0.00 sec)

视图字段含义如下:

  • query:经过标准化转换的语句字符串

  • db:语句对应的默认数据库,如果没有默认数据库,该字段为NULL

  • exec_count:语句执行的总次数

  • total_latency:语句执行的总延迟时间(执行时间)

  • memory_tmp_tables:语句执行时创建内部内存临时表的总数量

  • disk_tmp_tables:语句执行时创建的内部磁盘临时表的总数量

  • avg_tmp_tables_per_query:对于使用了内存临时表的语句,每个语句使用内存临时表的平均数量(SUM_CREATED_TMP_TABLES/COUNT_STAR)

  • tmp_tables_to_disk_pct:内存临时表的总数量与磁盘临时表的总数量百分比,表示磁盘临时表的转换率(SUM_CREATED_TMP_DISK_TABLES/SUM_CREATED_TMP_TABLES)

  • first_seen:该语句第一次出现的时间

  • last_seen:该语句最近一次出现的时间

  • digest:语句摘要计算的md5 hash值

本期内容就介绍到这里,本期内容参考链接如下:

  • https://dev.mysql.com/doc/refman/5.7/en/sys-schema-tables-with-full-table-scans.html

  • https://dev.mysql.com/doc/refman/5.7/en/sys-statements-with-temp-tables.html

  • https://dev.mysql.com/doc/refman/5.7/en/sys-statement-analysis.html

  • https://dev.mysql.com/doc/refman/5.7/en/sys-statements-with-errors-or-warnings.html

  • https://dev.mysql.com/doc/refman/5.7/en/sys-statements-with-full-table-scans.html

  • https://dev.mysql.com/doc/refman/5.7/en/sys-statements-with-runtimes-in-95th-percentile.html

  • https://dev.mysql.com/doc/refman/5.7/en/sys-statements-with-sorting.html

| 作者简介

罗小波·数据库技术专家

《千金良方——MySQL性能优化金字塔法则》、《数据生态:MySQL复制技术与生产实践》作者之一。熟悉MySQL体系结构,擅长数据库的整体调优,喜好专研开源技术,并热衷于开源技术的推广,在线上线下做过多次公开的数据库专题分享,发表过近100篇数据库相关的研究文章。

全文完。

Enjoy MySQL :)

叶老师的「MySQL核心优化」大课已升级到MySQL 8.0,扫码开启MySQL 8.0修行之旅吧

MySQL8.0使用sys.statement_performance_analyzer排查性能问题 MySQL8.0使用sys.statement_performance_analyzer()排查性能问题 简介 在MySQL8.0中提供了提供了许多性能排查的表,视图,工具等。其中statement_performance_analyzer()则是sys库下的一个存储过程,用于生成events_statements_summary_by_digest表的两个快照,并对比两个快照,生成增量报告,这对于查看高峰时系统在执行哪些查询非常有用。 参数 参数如下表 参数 有效值 描述 action S 阅读详情

相关推荐

MySQL SYS库下面的常用性能视图说明

【代码】MySQL SYS库下面的常用性能视图说明。

堂前燕的博客 188

fullscan mysql_mysql8 参考手册-statement_with_full_table_scans和x$statements_with_full_table_scans视图...

这些视图显示已完成全表扫描的规范化语句。默认情况下,行是按完整扫描的时间百分比递减和总延迟时间递减排序的。在 statements_with_full_table_scans 和 x$statements_with_full_table_scans 意见有这些列:query规范化的语句字符串。db语句的默认数据库, NULL如果没有。exec_count语句已执行的总次数。total_latenc...

weixin_42127937的博客 521

Java面试宝典:MySQL中的系统库

MySQL 包含多个关键系统数据库,它们存储了服务器运行过程中的元数据、状态信息及性能指标。这些系统库MySQL 内部管理机制的基石,提供对数据库底层运作的可见性。该库专注于性能监控,记录服务器运行时资源消耗、等待事件和执行统计。它收集包括 SQL 语句执行时间、内存使用量、I/O 操作等底层性能数据,帮助用户诊断性能瓶颈。所有数据存储在内存中,重启后丢失,但对实时性能分析至关重要。作为 MySQL 的“数据字典”,提供所有数据库对象的元数据信息。用户可以查询表结构、索引、视图、存储过程等详细信息。

搬砖的小熊猫的博客 348

MYSQL骚操作之第四十话之索引优化+SQL常用高频语句+删除区别

文章目录前言一、索引优化1、Btree索引1.1、概述1.2、存储结构1.3、MHISAM引擎索引结构2、HASH索引2.1、概述及存储结构2.2、HASH索引的弊端3、FULLTEXT3.1、概述3.2、存储结构4、聚集索引4.1、聚集索引4.2、举例4.3、误区5、非聚集索引5.1、非聚集索引5.2、举例6、区别7、索引与主键的区别8、面试题:hash和btree的区别二、索引利弊1、索引的好处2、索引的弊端三、判断是否应该建索引的条件四、数据库性能相关命令1、查看每个客户端IP过来的连接消耗了多少资源

HYMajor的博客 784

MySQL系统SYS数据库——各类统计视图整理

查看表的统计信息,默认情况下按照增删改查操作的总表I/O延迟时间(执行时间,即也可以理解为是存在最多表I/O争用的表)降序排序 查看不活跃的索引(没有任何事件发生的索引,这表示该索引从未使用过),默认情况下按照schema名称和表名进行排序 查看表的统计信息,默认情况下按照增删改查操作的总表I/O延迟时间(执行时间,即也可以理解为是存在最多表I/O争用的表)降序排序 查看不活跃的索引(没有任何事件发生的索引,这表示该索引从未使用过),默认情况下按照schema名称和表名进行排序

发现问题,面对问题,分析问题,解决问题,总结问题 4881

select 统计 没有 为0_语句效率统计视图 | 全方位认识 sys 系统库

在上一篇《统计信息查询视图|全方位认识 sys 系统库》中,我们介绍了利用sys 系统库的查询统计信息的快捷视图,本期将为大家介绍语句查询效率语句统计信息相关的视图,这些视图可以快速找出数据库中哪些语句使用了全表扫描、哪些语句使用了文件排序、哪些语句使用了临时表。PS:由于本文中所提及的视图功能的特殊性(DBA日常工作中可能需要查询一些信息做一些数据分析使用),所以下文中会列出部分视图中...

weixin_39861498的博客 144

视图字段限制_语句效率统计视图 | 全方位认识 sys 系统库

在上一篇《统计信息查询视图|全方位认识 sys 系统库》中,我们介绍了利用sys 系统库的查询统计信息的快捷视图,本期将为大家介绍语句查询效率语句统计信息相关的视图,这些视图可以快速找出数据库中哪些语句使用了全表扫描、哪些语句使用了文件排序、哪些语句使用了临时表。PS:由于本文中所提及的视图功能的特殊性(DBA日常工作中可能需要查询一些信息做一些数据分析使用),所以下文中会列出部分视图中...

weixin_42329733的博客 236

其他混杂视图 | 全方位认识 sys 系统库

在《语句效率统计视图|全方位认识 sys 系统库》中,为大家介绍了利用sys 系统库查询语句执行效率的快捷视图,本期将为大家介绍一些不便归类的混杂视图,本篇也是该系列中最后一篇介绍视图的...

老叶茶馆 532

if mysql sum 视图_其他混杂视图 | 全方位认识 sys 系统库

在《语句效率统计视图|全方位认识 sys 系统库》中,为大家介绍了利用sys 系统库查询语句执行效率的快捷视图,本期将为大家介绍一些不便归类的混杂视图,本篇也是该系列中最后一篇介绍视图的文章。PS:由于本文中所提及的视图功能的特殊性(DBA日常工作中可能需要查询一些信息做一些数据分析使用),所以下文中会列出部分视图中的select语句文本,以便大家更直观地学习。01metricsserv...

weixin_35688354的博客 102

带你认识MySQL sys schema

sys schema介绍 前言: MySQL 5.7中引入了一个新的sys schema,sys是一个MySQL自带的系统库,在安装MySQL 5.7以后的版本,使用mysqld进行初始化时,会自动创建sys库。 sys库里面的表、视图、函数、存储过程可以使我们更方便、快捷的了解到MySQL的一些信息,比如哪些语句使用了临时表、哪个SQL没有使用索引、哪个schema中有冗余索引、查找使用全表扫...

MySQL技术 1275

MySQL 5.7中的sys schema

前言: MySQL 5.7中引入了一个新的sys schema,sys是一个MySQL自带的系统库,在安装MySQL 5.7以后的版本,使用mysqld进行初始化时,会自动创建sys库。 sys库里面的表、视图、函数、存储过程可以使我们更方便、快捷的了解到MySQL的一些信息,比如哪些语句使用了临时表、哪个SQL没有使用索引、哪个schema中有冗余索引、查找使用全表扫描的SQL、查找用户占用的IO等,sys库里这些视图中的数据,大多是从performance_schema里面获得的。目标是把perform

shassd的博客 319

MySQL 内置数据库详解:你不知道的系统秘密!

MySQL内置的系统数据库支撑着数据库的核心运行,主要包括mysql(权限管理)、information_schema(元数据查询)、performance_schema(性能监控)、sys(性能调优视图)和innodb(8.0.30+新增的InnoDB引擎信息)。这些数据库各有专长:mysql用于用户权限管理,information_schema提供数据库结构信息,performance_schema记录SQL执行详情,sys简化性能分析,而innodb则展示存储引擎内部状态。通过实战案例可以看到,合理利

程序员极光 871

SQL Server锁机制原理与实战诊断指南

锁是数据库实现ACID中隔离性与一致性的核心机制,其本质是在并发访问下对数据资源施加的访问控制。SQL Server通过共享锁(S)、排他锁(X)、更新锁(U)及意向锁等模式,在行(KEY)、页(PAGE)、表(TABLE)等多粒度上动态协调读写冲突。锁兼容性矩阵决定了阻塞是否发生,而锁升级与死锁则是资源权衡下的必然现象。掌握sys.dm_tran_locks、sys.dm_exec_requests等DMV可快速定位阻塞链,结合Profiler可追溯锁生命周期。真实场景中,索引缺失常导致锁粒度失控,RCS

477

MySQL系统表详解:information_schema、mysql、performance_schema等系统数据库解析

主要系统数据库包括: information_schema:提供数据库元数据访问,包含所有数据库对象信息 mysql:存储用户权限、插件、日志等核心系统数据 performance_schema:收集数据库服务器性能指标 sysMySQL 5.7+):基于performance_schema的视图,简化性能监控 1.2 系统数据库的存储特性 这些系统数据库与普通用户数据库有显著区别: 只读性:大部分系统表是只读的,不能直接修改 内存表:许多系统表实际上是内存表,服务器重启后会重置 特殊权限:需要特定权

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 507

SQL注入绕过实战:WAF过滤information_schema后的数据库信息获取技巧

SQL注入是Web安全领域的经典漏洞类型,其核心原理是通过构造恶意SQL语句,干扰应用程序与数据库的正常交互逻辑。在渗透测试与安全防御的对抗中,Web应用防火墙(WAF)常通过过滤information_schema等系统数据库来阻断攻击。然而,深入理解数据库内部机制,如MySQLsys数据库视图、InnoDB引擎统计表(innodb_table_stats)以及报错信息泄露特性,便能开辟新的攻击路径。这些技术价值在于,即便在严格防护下,攻击者仍可通过探测数据库自身元数据或触发特定错误,获取关键的表名、列

weixin_30765577的博客 405

PostgreSQL 系统数据库有哪些

系统数据库:指的是 postgres、template1 和 template0,它们是初始化自动生成的物理数据库,分别承担管理入口、默认模板和纯净备份的作用。系统库的广义理解:也常指每个数据库内部的 pg_catalog 和 information_schema 模式,它们是存储和检索元数据的逻辑“库”。与其他数据库的对比:PostgreSQL 没有独立的 mysqlsys 数据库,所有管理操作、性能监控都通过 pg_catalog 模式中的系统表/视图完成。

marc2719的博客 325

《APP启动优化指南》

本文字数:7485字预计阅读时间:19分钟2021年初,搜狐视频iOS技术团队开始实施启动优化项目,经过10个月优化后,搜狐视频iOS端启动时间从2秒级,降低到1秒级,优化幅度为46%。我们的技术团队通过多项技术优化和创新,呈现了搜狐视频app自己的启动优化解决方案。启动优化成果如图:(注:启动耗时中包含开屏广告接口时延)像搜狐视频APP这样涉及音视频业务、迭代时间超过10年的项目,包含了众多...

SOHU_TECH的博客 1264
上一篇: 统计信息查询视图|全方位认识 sys 系统库
下一篇: 其他混杂存储过程 | 全方位认识 sys 系统库
老叶茶馆_
博客等级 码龄9年 1137粉丝 411原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值