MySQL中提供了内置的性能分析工具profiling今天就一起看下这个工具怎么使用.


首先确认profiling工具状态

查看profiling相关变量开关及存储记录数

show VARIABLES like 'profil%'-------------------------------profiling       ONprofiling_history_size       15



为了方便测试先将存储记录调为100

set profiling_history_size = 100;



准备一条测试SQL

在test库下自定义uu表执行查询SQL分析执行情况.

SELECT _rowid,u.*from test.uu u;

Mysql之性能分析工具profiling_java


查看SQL ID

查看最近执行的SQL可以发现该SQL的query id 61,

show profiles;


Mysql之性能分析工具profiling_java_02


执行sql分析各阶段执行情况.

show profile for query 61;

Mysql之性能分析工具profiling_java_03

可以发现该SQL执行时间最长的executing阶段.

因为该sql是简单查询表中数据又很少分析结果也是符合实际情况的.


不过show profile 是一个即将被废弃掉的命令,

官方已经推荐使用performance_schema.profiling表来查看SQL执行情况了.


performance_schema.profiling表结构

1QUERY_ID查询ID, 用于标记不同的查询
2SEQ一个查询内部执行的步骤 , 从2开始
3STATE步骤的状态
4DURATION持续时间(单位: 秒)
5CPU_USER用户空间的cpu使用量
6CPU_SYSTEM内核空间的cpu使用量
7CONTEXT_VOLUNTARY上下文主动切换
8CONTEXT_INVOLUNTARY上下文被动切换
9BLOCK_OPS_IN阻塞输入操作
10BLOCK_OPS_OUT阻塞输出操作
11MESSAGES_SENT消息发送
12MESSAGES_RECEIVED消息接受
13PAGE_FAULTS_MAJOR主分页错误
14PAGE_FAULTS_MINOR次分页错误
15SWAPSswap次数
16SOURCE_FUNCTIONMySQL源码函数
17SOURCE_FILE源码文件
18SOURCE_LINE源码行数



通过profiling分析SQL执行情况:

SELECT * from information_schema.profiling where query_id = 61;

Mysql之性能分析工具profiling_java_04可以发现执行时间是一样的同时还增加了更多的信息.需要注意的是Sending data状态并不是单纯的发送数据,而是包括收集,发送数据两个阶段.这里列出来的state并不是所有状态比如用到临时表时还会有Creating tmp table等状态.
上述例子opening table占用时间最长但这只限于当前情况在不同的情况下占用时间是不同的所以一定要根据实际情况分析不能一概而论.
有观点认为这是个鸡肋的工具并不能提供很好的解决方案我想, profiling能从更宏观的角度去发现问题, 提供信息算是个很不错的分析工具.