前言:SHOW PROFIL命令是MySQL提供可以用来分析当前会话中语句执行的资源消耗情况。可以用于SQL的调优的测量。
一、参数的开启和关闭设置
1.1 参数的查看
默认情况下,参数处于关闭状态,并保存最近15次的运行结果
mysql> show variables like 'profiling%';
+------------------------+-------+
| Variable_name | Value |
+------------------------+-------+
| profiling | OFF |
| profiling_history_size | 15 |
+------------------------+-------+
2 rows in set
1.2 参数的开启和关闭(参数为会话级参数,只对当前会话有效)
开启操作如下:
mysql> SET profiling=1;或 SET profiling=on;
mysql> SET profiling=on;
Query OK, 0 rows affected
mysql> show variables like 'profiling%';
+------------------------+-------+
| Variable_name | Value |
+------------------------+-------+
| profiling | ON |
| profiling_history_size | 15 |
+------------------------+-------+
2 rows in set
关闭的操作:
mysql> SET profiling=0;或 SET profiling=off;
二、操作步骤
2.1 进行开启操作: SET profiling=on;
2.2 运行相应的SQL语句;
2.3 查看总体结果:show profiles;
2.4 查看详细的结果:SHOW PROFILE FOR QUERY n,这里的n就是对应SHOW PROFILES输出中的Query_ID;
mysql> show profiles;
+----------+------------+------------------------------------+
| Query_ID | Duration | Query |
+----------+------------+------------------------------------+
| 1 | 0.00077425 | select count(*) from tab_user_info |
| 2 | 0.0013575 | select count(*) from tab_tel_area |
| 3 | 9.7E-5 | select count(*) from tab_tel_area |
| 4 | 0.005193 | show variables like 'profiling%' |
+----------+------------+------------------------------------+
4 rows in set
mysql> show profile for query 2;
+--------------------------------+----------+
| Status | Duration |
+--------------------------------+----------+
| starting | 2E-5 |
| checking query cache for query | 4.7E-5 |
| Opening tables | 0.001163 |
| System lock | 4E-6 |
| Table lock | 4.1E-5 |
| init | 1.6E-5 |
| optimizing | 6E-6 |
| executing | 1.4E-5 |
| end | 5E-6 |
| query end | 3E-6 |
| freeing items | 3.1E-5 |
| storing result in query cache | 5E-6 |
| logging slow query | 3E-6 |
| cleaning up | 2E-6 |
+--------------------------------+----------+
14 rows in set
说明:报告给出了查询执行的每个步骤及花费的时间,当语句是很简单的一次执行的时候,可以很清楚的看出语句每个顺序花费的时间,但是当语句是嵌套循环等操作的时候,看这个报告就会变得很痛苦,因此整理了以下语句对相同类型的操作进行汇总,脚本如下:
mysql> SET @QUERY_ID=1;
mysql> SELECT STATE,SUM(DURATION) AS TOTAL_R,
ROUND(100*SUM(DURATION)/(SELECT SUM(DURATION)
FROM INFORMATION_SCHEMA.PROFILING
WHERE 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;