千金良方:MySQL性能优化金字塔法则
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

9.9 查看哪些语句使用了全表扫描

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

下面是使用statements_with_full_table_scans视图查询的结果集。

mysql> select * from statements_with_full_table_scans limit 1\G
*************************** 1. row ***************************
                  query: SELECT`performance_schema`.  ... ance`. `SUM_TIMER_WAIT`DESC # 经过标准化转换的语句字符串
                    db: sys       # 语句对应的默认数据库,如果没有默认数据库,则该字段值为NULL
              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  # 语句摘要计算的MD5 hash1 row in set(0.01 sec)

下面贴出视图查询语句文本。

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;