MySQL中show profile
-
正常情况下:收到爆栈,通过开启慢日志找到SQL,然后执行explain查看SQL,是可以解决大部分问题的。但是仍然找不到问题,可以通过show profile让检测的粒度更细化,比如在传输,网络连接,死锁等现象问题排查。如果再不行就需要配合DBA,进行数据库配置文件优化。
-
show profile是mysql提供可以用来分析当前会话中语句执行的资源消耗情况,可以用于SQL的调优测量。官网
-
分析步骤:
- 查看当前MySQL版本是否支持:默认条件关闭状态,并保存最近15次运行结果。
show variables like 'profiling';
-
开启功能,默认是关闭,使用前需要开启。
set profiling=on;
-
运行sql:
select * from emp group by id%10; select * from emp group by id%20 order by 5; ...
-
通过show profiles查看执行sql时间的结果:
Query_ID 查询的ID Duration 执行时间 Query 当前执行SQL语句
-
诊断SQL
show profile cpu,block io for query [Query_ID]
show profile cpu,block io for query 12
这里只列出了cpu和 block io 当然 诊断类型不止这些:
ALL 显示所有的开销信息 BLOCK IO 显示块IO相关开销 CONTEXT SWITCHES 上下文切换相关开销 CPU 显示CPU相关开销信息 IPC 显示发送和接收相关开销信息 MEMORY 显示内存相关开销信息 PAGE FAULTS 显示页面错误相关开销 SOURCE 显示和Source_function,Source_file,Source_line相关的开销信息 SWAPS 显示交换次数相关开销的信息
- 象用什么类型只需往后加就行,常用的cpu和block io
-
虽然show profile让我们粒度更细的去分析整个sql生命周期,那么如何区分哪条SQL有问题呢?
日常开发注意结论,出现以下4个就会出现很大问题: converting HEAP to MyISAM 查询结果太大,内存都不够用了往磁盘上搬 Creating tmp table 创建临时表,拷贝数据到临时表,用完再删除 Copy to tmp table on disk 把内存中临时表赋值到磁盘,很危险 locked 存在锁
查看id=19语句生命周期:它的时间很长
show profile cpu,block io for query 19;
Creating tmp table Copy to tmp table removing tmp table 当然会慢了
全局查询日志:
-
只允许在测试环境上使用,永远不要在生产环境开启此功能
-
启动
1.终端启动: set global general_log=1; set global log_output='TABLE'; # 以后,你所编写的sql语句,将会记录到mysql库里的general_log表中,可以用下面命令查看 select * from mysql.general_log; 2.配置文件启动: mysql的my.cnf 设置 general_log=1 general_log_file=/path/logfile # 记录日志文件的路径 log_output=FILE #输出格式