MysqlSQL性能分析及调优
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
MysqlSQL性能分析及调优
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的说明可以查看⽂章:
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的结果:
我们可以看到进⼀步优化的语句。