MySQL优化之慢日志查询


Posted in MySQL onJune 10, 2022

一、慢查询日志概念

对于SQL和索引的优化问题,我们会使用explain去分析SQL语句。但是真正的企业级项目有成千上万条SQL,我们不可能从头开始一条一条explain去分析。我们从什么地方可以获取那些运行时间长,耗性能的SQL??

我们可以打开慢查询日志

根据具体的业务和并发量来预估一个时间上限(20ms、100ms),设置好后开启业务,压测后打开慢查询日志,就会看到超过执行时间的SQL,然后使用explain分析这些耗时的SQL语句

步骤如下:

  1. 打开慢查询日志开关slow_query_log
  2. 设置合理的、业务可以接受的慢查询时间上限
  3. 压测执行各种业务
  4. 查看慢查询日志,找出所有执行耗时的SQL语句
  5. 用explain分析这些耗时的SQL语句,从而针对性优化

MySQL可以设置慢查询日志,当SQL执行的时间超过我们设定的时间,那么这些SQL就会被记录在慢查询日志当中,然后我们通过查看日志,用explain分析这些SQL的执行计划,来判定为什么效率低下,是没有使用到索引?还是索引本身创建的有问题?或者是索引使用到了,但是由于表的数据量太大,花费的时间就是很长,那么此时我们可以把表分成多个小表等。

慢查询日志相关的参数如下所示:
(MySQL定义的很多的全局的开关,都是在全局变量中存储,可以用show/set variables查看或者设置全局变量的值)

MySQL优化之慢日志查询
慢查询日志开关默认是关闭的
慢查询日志的路径:默认在/var/lib/mysql/

慢查询日志记录了包含所有执行时间超过参数 long_query_time(单位:秒)所设置值的 SQL语句的日志,在MySQL上用命令可以查看,如下:

MySQL优化之慢日志查询
这个值是可以修改的:

MySQL优化之慢日志查询

二、慢查询日志实践

1. 打开慢查询日志开关slow_query_log

MySQL优化之慢日志查询

在打开慢查询日志开关的时候,报错表示slow_query_log是一个global的变量(也有只影响当前session的变量,如:long_query_time 、profiling),修改后会影响所有的session,即影响所有正在访问当前MySQL server的客户端。
MySQL优化之慢日志查询
打开慢查询日志开关成功!

2. 设置合理的、业务可以接受的慢查询时间上限long_query_time

MySQL优化之慢日志查询
查看另一个session

MySQL优化之慢日志查询
发现还是默认的10s,故long_query_time只影响当前session

3. 压测执行各种业务

MySQL优化之慢日志查询
已经超过我们设置的long_query_time=0.1s

4. 查看慢查询日志

路径:/var/lib/mysql/
MySQL优化之慢日志查询
MySQL优化之慢日志查询

5. 用explain分析这些耗时的SQL语句,从而针对性优化

MySQL优化之慢日志查询
做了整表的搜索,把主键索引树整个扫了一遍。

我们应该给password添加索引,然后记得password是字符串格式,因为如果涉及类型转换是用不了索引的

三、show profiles查看sql具体的运行时间

MySQL一般只显示小数点后两位的时间
MySQL优化之慢日志查询
打开profiling开关,显示更详细的时间

MySQL优化之慢日志查询
没有报错,说明profiling变量只影响当前session

MySQL优化之慢日志查询


Tags in this post...

MySQL 相关文章推荐
详解MySQL InnoDB存储引擎的内存管理
Apr 08 MySQL
详解MySQL主从复制及读写分离
May 07 MySQL
mysql 带多个条件的查询方式
Jun 05 MySQL
为什么MySQL选择Repeatable Read作为默认隔离级别
Jul 26 MySQL
MySQL对数据表已有表进行分区表的实现
Nov 01 MySQL
如何避免mysql启动时错误及sock文件作用分析
Jan 22 MySQL
一条慢SQL语句引发的改造之路
Mar 16 MySQL
MySQL分区表管理命令汇总
Mar 21 MySQL
Mysql排查分析慢sql之explain实战案例
Apr 19 MySQL
MySQL去除密码登录告警的方法
Apr 20 MySQL
Mysql数据库事务的脏读幻读及不可重复读详解
May 30 MySQL
MySQL中order by的执行过程
Jun 05 MySQL
MySql中的json_extract函数处理json字段详情
Jun 05 #MySQL
Mysql中@和@@符号的详细使用指南
Jun 05 #MySQL
MySQL中JOIN连接的基本用法实例
Jun 05 #MySQL
MySQL中order by的执行过程
MySQL 语句执行顺序举例解析
Jun 05 #MySQL
MySql数据库触发器使用教程
Jun 01 #MySQL
MySQL选择合适的备份策略和备份工具
You might like
Apache, PHP在Windows 9x/NT下的安装与配置 (二)
2006/10/09 PHP
Linux服务器下PHPMailer发送邮件失败的问题解决
2017/03/04 PHP
实例讲解PHP表单处理
2019/02/15 PHP
$()JS小技巧
2007/07/21 Javascript
javascript:以前写的xmlhttp池,代码
2008/05/18 Javascript
jquery tools系列 expose 学习
2009/09/06 Javascript
js 如何实现对数据库的增删改查
2012/11/23 Javascript
jquery全选/全不选/反选另一种实现方法(配合原生js)
2013/04/07 Javascript
js实现的点击数量加一可操作数据库
2014/05/09 Javascript
Javascript简单实现面向对象编程继承实例代码
2015/11/27 Javascript
vue中渐进过渡效果实现
2016/10/27 Javascript
详解AngularJS ng-class样式切换
2017/06/27 Javascript
Vue中的验证登录状态的实现方法
2019/03/09 Javascript
Nginx设置为Node.js的前端服务器方法总结
2019/03/27 Javascript
Vue Element UI + OSS实现上传文件功能
2019/07/31 Javascript
JS中的算法与数据结构之队列(Queue)实例详解
2019/08/20 Javascript
解决layer.open弹出框不能获取input框的值为空的问题
2019/09/10 Javascript
vue.js实现左边导航切换右边内容
2019/10/21 Javascript
JavaScript写个贪吃蛇小游戏(超详细)
2020/03/17 Javascript
es6函数name属性功能与用法实例分析
2020/04/18 Javascript
简单了解vue 插值表达式Mustache
2020/07/22 Javascript
Python内置函数Type()函数一个有趣的用法
2015/02/18 Python
Python中字符串的格式化方法小结
2016/05/03 Python
Django组件之cookie与session的使用方法
2019/01/10 Python
python顺序执行多个py文件的方法
2019/06/29 Python
Django通过dwebsocket实现websocket的例子
2019/11/15 Python
pytorch绘制并显示loss曲线和acc曲线,LeNet5识别图像准确率
2020/01/02 Python
Python中sorted()排序与字母大小写的问题
2020/01/14 Python
python中matplotlib实现随鼠标滑动自动标注代码
2020/04/23 Python
澳大利高级泳装品牌:Bondi Born
2018/05/23 全球购物
世界上最大的在线汽车租赁预订平台:Rentalcars.com(支持中文)
2018/10/12 全球购物
聚网科技C++面试笔试题
2015/09/01 面试题
自学考试自我鉴定范文
2013/09/26 职场文书
给朋友的赠语
2015/06/23 职场文书
关于运动会的广播稿
2015/08/19 职场文书
《7的乘法口诀》教学反思
2016/02/18 职场文书