Fork me on GitHub

show profile查看SQL执行生命周期

MySQL中show profile

  • 正常情况下:收到爆栈,通过开启慢日志找到SQL,然后执行explain查看SQL,是可以解决大部分问题的。但是仍然找不到问题,可以通过show profile让检测的粒度更细化,比如在传输,网络连接,死锁等现象问题排查。如果再不行就需要配合DBA,进行数据库配置文件优化。

  • show profile是mysql提供可以用来分析当前会话中语句执行的资源消耗情况,可以用于SQL的调优测量。官网

  • 分析步骤:

    1. 查看当前MySQL版本是否支持:默认条件关闭状态,并保存最近15次运行结果。
    show variables like 'profiling';
    

    1. 开启功能,默认是关闭,使用前需要开启。

      set profiling=on;
      
    2. 运行sql:

      select * from emp group by id%10;
      select * from emp group by id%20 order by 5;
      ...
      
    3. 通过show profiles查看执行sql时间的结果:

      Query_ID 查询的ID
      Duration  执行时间
      Query     当前执行SQL语句
      
    4. 诊断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
    5. 虽然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  #输出格式
    
posted @ 2020-03-15 11:38  是阿凯啊  阅读(579)  评论(0编辑  收藏  举报