mysql 使用show profiles性能分析和记录最近sql

介绍:是mysql提供可以用来分析当前会话中语句执行的资源消耗情况。可以用于SQL的调优测量

我们知道:sql值慢主要是cpu和IO 慢
1、查看是否开启

  • profiling = ON 开启 ; profiling = OFF 关闭
  • profiling_history_size=15 保存最近15次sql
SHOW VARIABLES LIKE 'profiling%';
image.png

2、开启

set profiling=1;

3、修改记录sql条数

set profiling_history_size = 50

4、查看最近执行的sql

show profiles;
image.png

5、查看某条sql的耗时信息;上一步前面的问题SQL 数字号码;

show profile cpu, block io for query 问题sql数字号码;
ALL: 显示所有的开销信息
BLOCK IO : 显示块IO相关开销
CONTEXT SWITCHS: 上下文切换相关开销
CPU : 显示cpu 相关开销
IPC: 显示发送和接收相关开销
MEMORY: 显示内存相关开销
PAGE FAULTS:显示页面错误相关开销信息
SOURCE : 显示和Source_function ,Source_file,Source_line 相关的开销信息
SWAPS:显示交换次数相关的开销信息
Status : sql 语句执行的状态
Duration: sql 执行过程中每一个步骤的耗时
CPU_user: 当前用户占有的cpu
CPU_system: 系统占有的cpu
Block_ops_in : I/O 输入
Block_ops_out : I/O 输出

出现以下情况说明sql性能问题,需要调优

  • converting HEAP to MyISAM 查询结果太大,内存都不够用了往磁盘上搬了。
  • Creating tmp table 、removing tmp table创建临时表、拷贝数据到临时表、用完再删除
  • Copying to tmp table on disk 把内存中临时表复制到磁盘,危险!!!
  • locked

实验

1、执行查询

select * from emp group by id%10 limit 150000;
select * from emp group by id%20 order by 5;
show profiles;

2、分析相应sql耗时

show profile cpu,block io for query 116;
image.png

Sending data时间过长

image.png

发现很长一段时间,查询都处在 “Sending data”状态

查询一下“Sending data”状态的含义,原来这个状态的名称很具有误导性,所谓的“Sending data”并不是单纯的发送数据,而是包括“收集 + 发送 数据”。

这里的关键是为什么要收集数据,原因在于:mysql使用“索引”完成查询结束后,mysql得到了一堆的行id,如果有的列并不在索引中,mysql需要重新到“数据行”上将需要返回的数据读取出来返回个客户端。
可能是下面的情况

  • select中有大文本字段

你可能感兴趣的:(mysql 使用show profiles性能分析和记录最近sql)