Mysql SQL性能分析及调优


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的结果:

 

 我们可以看到进一步优化的语句。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM