Mysql性能诊断利器---profile
大家平时做mysql运维时,会碰到很多很诡异的问题,我就碰到过,一个按照主键查询sql平时只要几毫秒就出结果,但是突然响应时间就变成3秒多,看执行计划都是正常,执行时间就不正常,检查服务器的IO,cpu没有异常,怀疑可能是网络延迟导致的,测试网络延时不到1ms,这个时候就非常郁闷,很想知道时间都耗在那里,MySQL中可以使用profile去查看SQL的执行时间主要消耗在哪里,下面看看profile的使用。
mysql的profile开始是session级别的,影响范围是可控的,可以使用以下命令查看是否开启profile,如果是以下结果,则没有开启
mysql> show profiles;
Empty set, 1 warning (0.01 sec)
使用以下方法进行开启
mysql> set profiling=1;
Query OK, 0 rows affected, 1 warning (0.02 sec)
如果想了解更多的用法,可以看mysql的帮助信息
mysql> ? show profiles;
下面就可以正常使用profile,开启之后,profile会自动收集所有当前session执行的语句
mysql> show profiles;
+----------+------------+-------------------------+
| Query_ID | Duration | Query |
+----------+------------+-------------------------+
| 1 | 0.01757800 | show databases |
| 2 | 0.02815125 | SELECT DATABASE() |
| 3 | 0.00048825 | show databases |
| 4 | 0.04561550 | show tables |
| 5 | 0.00050200 | show tables |
| 6 | 0.03086925 | select count(*) from t1 |
| 7 | 0.06646750 | help 'show profiles' |
| 8 | 0.00770600 | help 'show profile' |
+----------+------------+-------------------------+
8 rows in set, 1 warning (0.00 sec)
举个例子,加入想看select count(*) from t1这个语句时间都耗在那里,可以用以下命令
上图中,可以很清楚的看到执行上述sql时间都耗在什么操作上,有很多时候,table_open_cache设置不合理,并发高之后,就会导致性能直线下降,使用这个方法很直观的就能看出时间损耗在opening tables上,就可以针对table_open_cache这个参数进行调优了。
当然profile可以同时查看CPU,BLOCK IO,SWAPS等信息
当然也有更偷懒的方法,查看所有性能数据
show profile all for query 6;