暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

【MySQL专栏】韩锋:MySQL诊断分析工具Profile

宜信技术学院 2021-05-28
903

1.概述

(1).说明

  • MySQL的Query Profiler是一个使用非常方便的Query诊断分析工具,通过该工具可以获取一条Query在整个执行过程中多种资源的消耗情况,如CPU、IO、IPC、SWAP等,以及发生的PAGE FAULTS、CONTEXT SWITCHE等,同时还能得到该Query执行过程中的MySQL所调用的各个函数在源文件中的位置。


  • MySQL5.0.37版本以上支持PROFILING调试功能,让您可以了解SQL语句消耗资源的详细信息。因为它需要调用系统的getrusage()函数,所以只是在Linux/Unix类平台上才能使用,而不能在Windows平台上使用。而且,PROFILING是针对处理进程(process)而不是线程(thread)的,服务器上的其他应用,可能会影响您的调试结果,因此,这个工具适合开发过程中的调试,如果要在生产环境中调试使用,则要注意它的局限性。


(2).SHOW PROFILE命令

格式

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


  • FOR QUERY n

指定查询的query_id。可用的query id,从show profiles可知。


  • LIMIT row_count{OFFSET offset}

指定输出的范围。


选项 -TYPE

  • ALL

displays all information


  • BLOCK IO

displays counts for block input and output operations


  • CONTEXT SWITCHES

displays counts for voluntary and involuntary contextswitches


  • CPU

displays user and system CPU usage times


  • IPC

displays counts for messages sent and received


  • MEMORY

is not currently implemented


  • PAGE FAULTS

displays counts for major and minor page faults


  • SOURCE

displays the names of functions from the source code,together with the name and line number of the file in which the function occurs


  • SWAPS

displays swap counts


示例

SHOW PROFILE FOR QUERY 2;

or

SELECT STATE, FORMAT(DURATION, 6) AS DURATION

FROM INFORMATION_SCHEMA.PROFILING

WHERE QUERY_ID = 2

ORDER BY SEQ;

2.相关操作

(1).开启QueryProfiler功能

mysql> select @@profiling;

mysql> set profiling=1;

*默认情况下profiling的值为0表示MySQLSQL Profiler处于OFF状态,开启SQL性能分析器后profiling的值为1。


(2).执行SQL语句

mysql> select count(*) from t1;


(3).获取概要信息

使用"show profile"命令获取当前系统中保存的多个Query的profile的概要信息。

mysql> show profiles;

+----------+------------+-------------------------+

| Query_ID | Duration | Query |

+----------+------------+-------------------------+

| 1 |0.00039300 | select count(*) from t1 |

+----------+------------+-------------------------+

profiling_history_size参数

这个List的长度由MySQL的数据库变量参数profiling_history_size决定,预设为15。最大值为100,设置为0则禁用此功能。


(4).针对单个Query获取详细的profile信息

在获取概要信息之后,就可以根据概要信息的Query_ID来获取某个Query的执行过程中详细的profile信息。

mysql> show profile for query 1;

mysql> show profile cpu,block io for query 1;


(5).排序profile信息

缺省报告时显示查询执行的每个步骤及其花费的时间,但很难快速定位到那个步骤花费时间最长,因为输出是按照执行顺序排序,而不是按照花费时间排序。可以使用下面方法,通过直接查询INFORMATION_SCHEMA中的对应表完成排序格式化输出。

SET @query_id=1;

SELECT STATE,SUM(DURATION) ASTotal_R,ROUND(100*SUM(DURATION)/(SELECT SUM(DURATION) FROM INFORMATION_SCHEMA.PROFILINGWHERE QUERY_ID=@query_id),2) AS Pct_R,COUNT(*) AS Calls,SUM(DURATION)/COUNT(*)AS "R/Call"

FROM INFORMATION_SCHEMA.PROFILING

WHERE QUERY_ID=@query_id

GROUP BY STATE

ORDER BY Total_R DESC;


文章转载自宜信技术学院,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论