开发者学堂课程【MySQL 高级应用 - 索引和锁:用 Show Profile 进行 sql 分析】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/598/detail/8628
用 Show Profile 进行 sql 分析
目录:
一、Show Profile 的定义
二、Show Profile 分析步骤
三、日常开发需要注意的结论
一、Show Profile 的定义
前情回顾:我们要进行数据的调优和排查,第一步先让故障重现
一般都是 DBA 或者运维工程师从监控系统里面收到了报站,系统变慢了。因为重要的系统都会有另外一套辅助的系统监控,这种监控系统慢于一个模块平均时间优化以后应该更快执行完毕,那么现在还是时间很长,所以程序还是有问题。
1、Show Profile 定义
是 mysql 提供可以用来分析当前会话中语句执行的资源消耗情况。可以用于 SQL 的调优的测量。
四层结构连接、服务、引擎、存储,打一条 sql 过来完整的生命周期走一圈。
假设有一种命令,能够把我走的全部路径走一遍,能够告诉你每一个执行步骤,分别使用了多长时间。
官网:
http://dev.mysql.com/doc/refman/5.5/en/show-profile.html
默认情况下,参数处于关闭状态,并保持最近15次的运行结果。//show profile 后台记录每一条 sql
show profile 命令用于跟踪执行过的 sql 语句的资源消耗信息,可以帮助查看 sql 语句的执行情况,可以在做性能分析或者问题诊断的时候作为参考。
二、Show Profile 分析步骤
1.是否支持,看看当前的 mysql 版本是否支持
Show variables like 'profiling';
默认是关闭,使用前需要开启,或者:
Show variables like 'profiling%';
2.开启功能,默认是关闭,使用前需要开启
show variables like 'profiling'
set profiling=on;
查看是否开启(on 代表已经开启,off 关闭):
SHOW VARIABLES LIKE 'profiling';
//运行结果如下图
示例:
Mysql>select * from tbl_emp;
//运行结果如下
8 rows in set (0.05 sec)
Mysql> select * from tbl_emp e inner join tbl_dept on e.deptip=d.id;
//运行结果如下图所示:
Error 1054(42s22):unknown column ‘d.id’ in ‘on clause’
Mysql> select * from tbl_emp e inner join tbl_dept d on e.deptid=d.id;
重复点击按钮就会重复发出一条 sql,后台就会记录到每一条 sql 的运行。
3. 运行 SQL
执行 show profiles 命令;
Mysql>select*from emp group by id%10 limit 150000;
//除数取余分组
运行代码显示结果如下图:
select*from emp group byid%20 order by5
//按照20分组查询
运行代码显示结果如下图:
4. 查看结果show profiles
//查询系统上所有执行过的 sql
Query_id 是从开始到现在发过9条 sql
Duration 是执行的时间
query 是执行命令的内容
5. 诊断 SQL,show profile cpu,block io for query 上一步前面的问题 SQL 数字号码;
命令:
Show profile type for query Query_ID
示例:
Mysql>show profile cpu,block io for query 3
//执行结果如下图
显示了完成查询生命周期,每一个步骤用了多少时间
参数备注:
ALL --显示所有的开销信息
BLOCKIO --显示块10相关开销
CONTEXTSWITCHES--上下文切换相关开销
CPU --显示 CPU 相关开销信息
IPC --显示发送和接收相关开销信息
MEMORY --显示内存相关开销信息
PAGEFAULTS --显示页面错误相关开销信息
SOURCE --显示和 Sourcefunction,Source file,Source line 相关的开销信息
SWAPS --显示交换次数相关开销的信息
三、日常开发需要注意的结论
1、converting HEAP to MyISAM 查询结果太大,内存都不够用了往磁盘上搬了。
2、Creating tmp table 创建临时表
为什么创建临时表比较难?
第一步新建临时表,第二步拷贝数据到程序表,第三步数据推送给主人以后还需要删掉临时表
拷贝数据到临时表
用完再删除
3、Copying to tmp table on disk 把内存中临时表复制到磁盘,危险!!!
4、locked
出现以上四个问题,一定是耗损内存,降低速度。,必须要进行优化。