使用以下命令查看当前 show profile 的状态SHOW VARIABLES LIKE 'profiling'
默认是开启状态,然后执行SHOW PROFILES
就可看到之前执行的 SQL 清单,包括标识ID , 执行耗时,具体 SQL 等。如下图:
上图就是我们所有执行的 SQL 清单,但是 Query 列出现了很多并不是我们显示执行的 SQL ,这个我也不太清楚,先不管它。默认的查询时当前最新的 15 条清单记录。如果想修改的话可以通过下面命令修改SET profiling_history_size = 100; #注意这个最大值只能到 100
从上图可以看到我们执行的 SQL 的标识 ID 和查询耗时。如果这里遇到耗时很长的一条。可以使用下面命令详细查询该条 SQL 对系统性能、资源的消耗。SHOW PROFILE cpu,block io,memory,swaps,context switches,source FOR QUERY 21;
如下图
第一列 Status 表示这条 SQL 执行的一系列步骤,包括开始、检查权限、打开表等等。然后第二列的 Duration 就是详细记录,每一个步骤的耗时。像这张图中都很正常,一般来说遇到耗时严重的会有几种情况。
1. create tmp table #创建临时表
2. Copying to tmp table on disk #把内存中的临时表复制到磁盘
3. lock #上锁了
还有其他很多情况,我不太了解。总之遇到耗时长的,就可以通过它的状态来判定是什么原因导致的。从而确定病因,对症下药!
show profile 和 explain 有啥区别呢? explain 是预估这条 SQL ,包括可能用到的索引,预估查询的类型等等,而 show profile 却是实打实的反应出这条 SQL 执行过程中每一个细节步骤到底消耗了系统资源多少的指标。可以说,show profile 要比 explain 权威的多。
总结:又打开了新世界的大门……