之前做sql优化,测量一个sql的效率最常用的就是看查询条数和执行时间,然后在explain的,可是用久了也会发现explain的也不一定详细,于是又发现了profile这个好东西。
profile的语法为
SHOW PROFILE [type [, type] ... ] [FOR QUERY n] [LIMIT row_count [OFFSET offset]] 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
* 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
一下是profile的使用方法,首先看你的mysql有木有开profile
SELECT @@PROFILing
如果是1,说明这个参数已经打开了,如果为0,用下面的语句打开就可以了
SET profiling = 1;
然后随便执行一个sql并show一下profiles,如下:
SELECT * FROM `employees`;
show PROFILES;
然后就会看到queryID,花费的时间及对应的查询
然后找到对应的queryID并用如下的语句
show PROFILE for query 151;
然后会显示如下的结果
可以用all来显示更多的有用信息
show PROFILE all for query 178;
profile能做什么?这里有一个博客就是用profile做的测试,结论是sql的前后加空格后,不会影响cache。sql中间加空格后会影响cache
查询必须是完全相同的(逐字节相同)才能够被认为是相同的。另外,同样的查询字符串由于其它原因可能认为是不同的。使用不同的数据库、不同的协议版本或者不同 默认字符集的查询被认为是不同的查询并且分别进行缓存。
这里有一篇explain,profile和慢日志一起讲的博客,分享一下
总结一下,profile是一个不错的分析sql的效率的工具。具体的语法就是show profile就可以了,可以看到执行每个sql的各个阶段的消耗。