1.环境
OS: CentOS 6.5 x64
MySQL: 5.6 for Linux (x86_64)
2.打开profiling
打开profiling可以统计资源统计功能。
mysql> set profiling=1; #打开profiling
Query OK, 0 rows affected, 1 warning (0.07 sec)
mysql> select count(*) from emp;
+----------+
| count(*) |
+----------+
| 14 |
+----------+
1 row in set (0.05 sec)
mysql> show profile; #显示最近执行的SQL的统计信息
+----------------------+----------+
| Status | Duration |
+----------------------+----------+
| starting | 0.052905 |
| checking permissions | 0.004080 |
| Opening tables | 0.000037 |
| init | 0.000025 |
| System lock | 0.000018 |
| optimizing | 0.000010 |
| statistics | 0.000021 |
| preparing | 0.000017 |
| executing | 0.000006 |
| Sending data | 0.000057 |
| end | 0.000012 |
| query end | 0.000013 |
| closing tables | 0.000013 |
| freeing items | 0.000287 |
| cleaning up | 0.000021 |
+----------------------+----------+
15 rows in set, 1 warning (0.09 sec)
mysql> show profiles; #显示最近执行的SQL列表,默认最多只能显示15条,可以通过修改profiling_history_size进行调整
+----------+------------+--------------------------+
| Query_ID | Duration | Query |
+----------+------------+--------------------------+
| 1 | 0.05752050 | select count(*) from emp |
+----------+------------+--------------------------+
1 row in set, 1 warning (0.02 sec)
#有一个报警
mysql> show warnings;
+---------+------+--------------------------------------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+--------------------------------------------------------------------------------------------------------------+
| Warning | 1287 | 'SHOW PROFILES' is deprecated and will be removed in a future release. Please use Performance Schema instead |
+---------+------+--------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
#显示show profiles这样的命令即将过期不再补支持,应该通过Performance Schema进行查询
mysql> use information_schema
Database changed
mysql> SELECT STATE, FORMAT(DURATION, 6) AS DURATION
-> FROM INFORMATION_SCHEMA.PROFILING
-> WHERE QUERY_ID = 2 ORDER BY SEQ;
可以这样查询,但内容不如show profile(s)直观。
mysql> select count(*) from bt; #再执行一句,这是大表
+----------+
| count(*) |
+----------+
| 47927530 |
+----------+
1 row in set (1 min 49.18 sec)
mysql> show profile; #显示最近SQL的统计信息
+----------------------+------------+
| Status | Duration |
+----------------------+------------+
| starting | 0.000184 |
| checking permissions | 0.000020 |
| Opening tables | 0.000030 |
| init | 0.000053 |
| System lock | 0.000019 |
| optimizing | 0.000013 |
| statistics | 0.000023 |
| preparing | 0.000021 |
| executing | 0.000007 |
| Sending data | 109.159082 | #由于是大表,这一步花了109秒多
| end | 0.029567 |
| query end | 0.011552 |
| closing tables | 0.000044 |
| freeing items | 0.000623 |
| logging slow query | 0.000016 |
| cleaning up | 0.000026 |
+----------------------+------------+
16 rows in set, 1 warning (0.21 sec)
mysql> show profiles; #看一下现在的语句列表,有两条了
+----------+--------------+--------------------------+
| Query_ID | Duration | Query |
+----------+--------------+--------------------------+
| 1 | 0.02656275 | select count(*) from emp |
| 2 | 108.16862700 | select count(*) from bt |
+----------+--------------+--------------------------+
2 rows in set, 1 warning (0.10 sec)
mysql> show profile for query 1; #如果想看第一条SQL的统计信息,就可以这样查询
+----------------------+----------+
| Status | Duration |
+----------------------+----------+
| starting | 0.000332 |
| checking permissions | 0.000031 |
| Opening tables | 0.000044 |
| init | 0.000046 |
| System lock | 0.000032 |
| optimizing | 0.000019 |
| statistics | 0.000036 |
| preparing | 0.000037 |
| executing | 0.000011 |
| Sending data | 0.025856 |
| end | 0.000039 |
| query end | 0.000016 |
| closing tables | 0.000019 |
| freeing items | 0.000028 |
| cleaning up | 0.000018 |
+----------------------+----------+
15 rows in set, 1 warning (0.08 sec)
3.profiling语法
show profile有许多选项,且看语法:
SHOW PROFILE [这些选项的意义如下:type
[,type
] ... ] [FOR QUERYn
] [LIMITrow_count
[OFFSEToffset
]]type
: ALL | BLOCK IO | CONTEXT SWITCHES | CPU | IPC | MEMORY | PAGE FAULTS | SOURCE | SWAPS
ALL
displays all information
BLOCK IO
displays counts for block input and output operations
CONTEXT SWITCHES
displays counts for voluntary and involuntary context switches
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
mysql> show profile block io,cpu for query 2; #查看第二条SQL的block io和cpu信息
+----------------------+------------+-----------+------------+--------------+---------------+
| Status | Duration | CPU_user | CPU_system | Block_ops_in | Block_ops_out |
+----------------------+------------+-----------+------------+--------------+---------------+
| starting | 0.000245 | 0.000000 | 0.000000 | 0 | 0 |
| checking permissions | 0.000030 | 0.000000 | 0.000000 | 0 | 0 |
| Opening tables | 0.000042 | 0.000000 | 0.000000 | 0 | 0 |
| init | 0.000074 | 0.000000 | 0.000000 | 0 | 0 |
| System lock | 0.000030 | 0.000000 | 0.000000 | 0 | 0 |
| optimizing | 0.000019 | 0.000000 | 0.000000 | 0 | 0 |
| statistics | 0.000032 | 0.000000 | 0.000000 | 0 | 0 |
| preparing | 0.000029 | 0.000000 | 0.000000 | 0 | 0 |
| executing | 0.000010 | 0.000000 | 0.000000 | 0 | 0 |
| Sending data | 108.126421 | 33.258944 | 3.981394 | 6507176 | 0 |
| end | 0.029766 | 0.001000 | 0.000000 | 424 | 0 |
| query end | 0.011333 | 0.001000 | 0.000000 | 208 | 0 |
| closing tables | 0.000041 | 0.000000 | 0.000000 | 0 | 0 |
| freeing items | 0.000519 | 0.000000 | 0.000000 | 0 | 0 |
| logging slow query | 0.000014 | 0.000000 | 0.000000 | 0 | 0 |
| cleaning up | 0.000023 | 0.000000 | 0.000000 | 0 | 0 |
+----------------------+------------+-----------+------------+--------------+---------------+
16 rows in set, 1 warning (0.00 sec)
会话退出后,profiling信息自动清空。