1、查看profile
打开profile开关后,执行SQL语句后,再执行 show profile即可看到profile内容:
这些数据会被Mysql记录在 INFORMATION_SCHEMA.PROFILING 表中。
但有一个问题,一个查询它最多记录100条,而一个复杂的SQL语句,细节数据远超100条,导致细节记录得不完整。
这个问题暂时没找到解决办法。
通过下面的语句可以以倒序的方式将INFORMATION_SCHEMA.PROFILING表中的最近执行过的SQL的profile内容展现出来:
SELECT * FROM INFORMATION_SCHEMA.PROFILING ORDER BY QUERY_ID DESC, SEQ DESC;
查询结果如下:
我们可以看到 这个查询的seq已经到了12270了,但这个表中也只会记录100条。
profile的说明可以查看文章: Mysql分析-profile详解
2、汇总profile
Show profile 给出了查询执行的每个步骤及花费的时间,当语句是很简单的一次执行的时候,可以很清楚的看出语句每个顺序花费的时间,
但是当语句是嵌套循环等操作的时候,看这个报告就会变得很痛苦,
因此整理了以下语句对相同类型的操作进行汇总,脚本如下:
--其中 123 位 Query_Id 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= 123 GROUP BY STATE ORDER BY TOTAL_R DESC;
结果如下图:
3、查看进一步优化后的SQL,但并非最终执行的SQL
通过 explain 查看执行计划后,再执行show warnings,可以进一步查看 进一步优化后的SQL,
但这个也并非最终Mysql执行的SQL。(曾今拿一个show warnings 中的SQL执行,1秒中即得到查询结果,但原SQL执行却要28秒。侧面说明show warnings 中的SQL并非真正执行的SQL)
explain select * from account; show WARNINGS
执行结果为:
图一为explain的结果:
图二为show Warnings的结果:
我们可以看到进一步优化的语句。