暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

09-mysql高级篇-Show Profile分析工具

潭时录 2021-11-30
561

点击蓝色“潭时录”关注我丫

每天和小潭一起快乐的学习~

    

    你好,我是在学mysql的小潭。在上一期08-mysql高级篇-千万级数据批量插入脚本推文中我们学习了向数据库批量插入千万级别数据的方法。今天,我们将继续对查询截取分析中的Show Profile分析工具做一下认识。


    对于sql的优化和分析,一般顺序是先在开发环境做问题重现再做问题的分析和解决。在先前的文章中我们学习了使用慢查询日志以及explain工具对慢SQL进行分析的方法,而更细粒度的分析则需要用到Show Profile工具。


一、是什么

    Show Profile工具是MySQL提供用来分析当前会话中语句执行的资源(链接-服务-引擎-存储)消耗情况。可以用于SQL的调优测量。

对应资料:https://dev.mysql.com/doc/refman/5.7/en/show-profile.html

默认情况下,该参数处于关闭状态,并保存最近15次的运行结果。


二、怎么用

    Show Profile工具的使用步骤可分为以下6步。

1.查看当前MySQL版本是否支持

show variables like 'profiling';

show variables like 'profiling%';


2.开启功能

默认是关闭,使用前需要开启。

set profiling=on;


3.运行需要分析的SQL

使用上一期推文中建立的数据库和表进行示例:

select * from emp group by id%10 limit 15000;
select * from emp group by id%20 order by 5;

说明:

示例SQL运行时可能会出现如下报错

原因:MySQL 5.7.5及以上功能依赖检测功能。如果启用了ONLY_FULL_GROUP_BY SQL模式(默认情况下),MySQL将拒绝选择列表,HAVING条件或ORDER BY列表的查询引用在GROUP BY子句中既未命名的非集合列,也不在功能上依赖于它们。也就是说对于GROUP BY的聚合操作,如果select中的列没有在GROUP BY中出现,那么该SQL不合法,在设置ONLY_FULL_GROUP_BY该参数时,必须使用MAX(),SUM(),ANT_VALUE()这种聚合函数才能完成GROUP BY的聚合操作。

我们可通过以下方式修改sql_mode参数来解决此报错。

方式1:会话配置

a. select @@global.sql_mode
b. 去除其中的ONLY_FULL_GROUP_BY参数重新设置sql_mode
c. 重新连接mysql

方式2:配置文件

a. vim /etc/mysql目录/my.cnf
b. 在mysqld下添加如下内容
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
c. 重启mysql服务
   service mysql restart
d. 重新连接mysql

使用方式1配置sql_mode后的示例SQL运行结果:



4.查看分析结果

show profiles;


5.诊断SQL

show profile cpu,block io for query 上一步骤中问题SQL的数字号码;
type参数说明:
       ALL :显示所有的开销信息
       BLOCK IO :显示块IO相关的开销
       CONTEXT SWITCHES :上下文切换相关开销
       CPU :显示CPU相关开销信息
       IPC :显示发送和接收相关的开销信息
       MEMORY :显示内存相关的开销信息
       PAGE FAULTS :显示页面错误相关的开销信息
       SOURCE :显示和Source_function, Source_file, Source_line相关的开销信息
       SWAPS :显示交换次数相关的开销信息


6.日常开发需要注意或检查的点(耗时过程)

1) converting HEAP to MyISAM 查询结果太长,内存不足会往磁盘上搬
2) Creating tmp table 创建临时表
   a.拷贝数据到临时表
   b.用完再删除
3Copying to tmp table on disk 把内存中的临时表复制到磁盘(危险动作)
4) locked



补充

    最后我们再补充一个SQL分析的辅助工具,即全局查询日志。该功能仅在测试环境辅助我们对SQL进行定量分析(开启后会记录所有sql,从而有助于我们对记录的日志进行分时段的分析),但永远不要在生产环境开启这个功能!

方式1.启用配置

mysql的配置文件my.cnf中设置:
# 开启
  general_log=1
  # 记录日志文件的路径
  general_log_file=/path/logfile
  # 输出格式
  log_output=FILE

方式2.编码启用

set global general_log=1;
set global log_output='TABLE'# 以表的形式记录


之后我们所编写的SQL语句将会被记录到MySQL库里的general_log表中
查看命令:select * from mysql.general_log;









下期预告:MySQL锁机制




如果你喜欢本文,
请长按二维码,关注 潭时录.
转发至朋友圈,是对我最大的支持。

点个 在看 
喜欢是一种感觉
在看是一种支持
↘↘↘
文章转载自潭时录,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论