MySQL|SHOW PROFILE命令详解

935 阅读3分钟

SHOW PROFILE命令详解

SHOW PROFILE是mysql提供分析资源消耗情况的工具,开启它可以让MySQL收集在执行语句的时候所使用的资源。 SHOW PROFILE可以深入的查看服务器执行语句的工作情况,发现SQL耗时到底出现在哪个环节。

1 开启

默认的是关闭的,会话级别可以开启这个功能:

set profiling = 1

查看是否开启:

show variables like "%profil%";

2 show profiles 记录SQL

模拟SQL查询


> select count(*) from customer;  
+----------+  
| count(*) |  
+----------+  
|      199 |  
+----------+  

show profiles查看当前session所有已产生的profile

> show profiles

+----------+------------+--------------------------------+  
| Query_ID | Duration   | Query                          |  
+----------+------------+--------------------------------+  
|        1 | 0.00253600 | show variables like '%profil%' |  
|        2 | 0.00138150 | select count(*) from customer  |  
+----------+------------+--------------------------------+  
2 rows in set, 1 warning (0.01 sec)  

3 show profile 分析SQL

3.1 参数及使用

官方提供的profile语法

SHOW PROFILE [type [, type] ... ]
    [FOR QUERY n]
    [LIMIT row_count [OFFSET offset]]

type: {
    ALL                显示所有信息
  | BLOCK IO           显示块IO开销
  | CONTEXT SWITCHES   显示自愿上下文切换和非自愿上下文切换的数量
  | CPU                显示用户和系统的CPU使用时间
  | IPC                显示已发送和已接收消息(messages)的数量
  | MEMORY             显示内存开销信息
  | PAGE FAULTS        显示主要和次要页面错误的数量
  | SOURCE             显示源代码中函数名称以及该函数所在文件的名称和行号
  | SWAPS              显示SWAP数量
}

分析SQL
根据 show profiles列表中的 Query_ID , 选择显示某条记录的性能分析信息

show profile for query 2;  

+----------------------+----------+  
| Status               | Duration |  
+----------------------+----------+  
| starting             | 0.000148 |  
| checking permissions | 0.000014 |  
| Opening tables       | 0.000047 |  
| init                 | 0.000023 |  
| System lock          | 0.000035 |  
| optimizing           | 0.000012 |  
| statistics           | 0.000019 |  
| preparing            | 0.000014 |  
| executing            | 0.000006 |  
| Sending data         | 0.000990 |  
| end                  | 0.000010 |  
| query end            | 0.000011 |  
| closing tables       | 0.000010 |  
| freeing items        | 0.000016 |  
| cleaning up          | 0.000029 |  
+----------------------+----------+  

show profile 默认只显示Duration 列总消耗时间,如果要显示更多可以设置 type参数。 [type] = ALL时,显示所有信息。

show profile all返回的字段含义

字段名称含义
Statussql 语句执行的状态
DURATION持续时间,单位s
CPU_USER用户态CPU时间,单位s
CPU_SYSTEM系统态CPU时间,单位s
CONTEXT_VOLUNTARY自愿上下文切换次数
CONTEXT_INVOLUNTARY非自愿上下文切换次数
BLOCK_OPS_IN块输入次数
BLOCK_OPS_OUT块输出次数
MESSAGES_SENT发送的消息数量
MESSAGES_RECEIVED接收的消息数量
PAGE_FAULTS_MAJOR要页面错误数量
PAGE_FAULTS_MINOR次要页面错误数量
SWAPS交换次数
SOURCE_FUNCTION源代码函数
SOURCE_FILE语源代码文件
SOURCE_LINE源代码行数

3.2 根据status分析SQL性能问题

status对应的描述有很多。其中有些可能是SQL有性能问题需要关注。常见的有下列情形

System lock
确认是由于哪个锁引起的,通常是因为MySQL或InnoDB内核级的锁引起的。
建议:如果耗时较大再关注即可,一般情况下都还好

Sending data
解释:从server端发送数据到客户端,也有可能是接收存储引擎层返回的数据,再发送给客户端,数据量很大时尤其经常能看见。 备注:Sending Data不是网络发送,是从硬盘读取,发送到网络是Writing to net。
建议:通过索引或加上LIMIT,减少需要扫描并且发送给客户端的数据量

Sorting result
正在对结果进行排序
建议:创建适当的索引

Table lock
表级锁,要么是因为MyISAM引擎表级锁,要么是其他情况显式锁表

create sort index
当前的SELECT中需要用到临时表在进行ORDER BY排序
建议:创建适当的索引

Creating tmp table
创建临时表。先拷贝数据到临时表,用完后再删除临时表。消耗内存,数据来回拷贝删除,消耗时间。
建议:优化索引

Copying to tmp table on disk
把内存中临时表复制到磁盘上
建议:优化索引,可以调整tmp_table_size参数,增大内存临时表大小

4 其他

show profile已经不建议使用,改用Performance Schema

所有信息可以从INFORMATION_SCHEMA.PROFILING表获取:

SELECT * FROM INFORMATION_SCHEMA.PROFILING WHERE QUERY_ID = query_id;

SHOW PROFILE 官方文档 dev.mysql.com/doc/refman/…