1. 程式人生 > >語句效率統計檢視 | 全方位認識 sys 系統庫

語句效率統計檢視 | 全方位認識 sys 系統庫

在上一篇《統計資訊查詢檢視|全方位認識 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$字首的檢視
[email protected]
: 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$字首的檢視
[email protected]
: 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$字首的檢視
[email protected] : 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$字首的檢視
[email protected] : 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$字首的檢視
[email protected] : 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$字首的檢視
[email protected] : 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$字首的檢視
[email protected] : 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語句文字,兩者的輸出長度有很大差別,如果你需要通過這些文字來甄別語句,那麼請留意這個差異
[email protected] : 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$字首的檢視
[email protected] : 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$字首的檢視
[email protected] : 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$字首的檢視
[email protected] : 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$字首的檢視
[email protected] : 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$字首的檢視
[email protected] : 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$字首的檢視
[email protected] : 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

| 作者簡介

羅小波·沃趣科技高階資料庫技術專家

IT從業多年,歷任運維工程師,高階運維工程師,運維經理,資料庫工程師,曾參與版本釋出系統,輕量級監控系統,運維管理平臺,資料庫管理平臺的設計與編寫,熟悉MySQL的體系結構時,InnoDB儲存引擎,喜好專研開源技術,追求完美。