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时间设置注意事项的深入总结
May 06 MySQL
MySQL sql_mode的使用详解
May 08 MySQL
mysql 8.0.24 安装配置方法图文教程
May 12 MySQL
MySQL之PXC集群搭建的方法步骤
May 25 MySQL
MySQL下使用Inplace和Online方式创建索引的教程
May 26 MySQL
MySQL笔记 —SQL运算符
Jan 18 MySQL
Mysql数据库表中为什么有索引却没有提高查询速度
Feb 24 MySQL
Mysql外键约束的创建与删除的使用
Mar 03 MySQL
MySQL学习之基础命令实操总结
Mar 19 MySQL
MySQL 外连接语法之 OUTER JOIN
Apr 09 MySQL
Mysql调整优化之四种分区方式以及组合分区
Apr 13 MySQL
关于MySQL中explain工具的使用
May 08 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
ThinkPHP中ajax使用实例教程
2014/08/22 PHP
php实现图片文件与下载文件防盗链的方法
2014/11/03 PHP
Yii视图CGridView实现操作按钮定义地址示例
2016/07/14 PHP
php中pcntl_fork创建子进程的方法实例
2019/03/14 PHP
表单(FORM)的一些实用效果代码
2007/03/25 Javascript
jquery实用代码片段集合
2010/08/12 Javascript
鼠标事件延时切换插件
2011/03/12 Javascript
用JavaScript实现PHP的urlencode与urldecode函数
2015/08/13 Javascript
全面了解addEventListener和on的区别
2016/07/14 Javascript
简易的JS计算器实现代码
2016/10/18 Javascript
微信小程序模板之分页滑动栏
2017/02/10 Javascript
详解VUE的状态控制与延时加载刷新
2017/03/27 Javascript
javascript动态创建对象的属性详解
2018/11/07 Javascript
Vue 动态组件与 v-once 指令的实现
2019/02/12 Javascript
详解vue中axios的使用与封装
2019/03/20 Javascript
详解nodejs http请求相关总结
2019/03/31 NodeJs
详解vue-cli中使用rem,vue自适应
2019/05/06 Javascript
JS数组方法join()用法实例分析
2020/01/18 Javascript
在vue中动态修改css其中一个属性值操作
2020/12/07 Vue.js
[01:09]模型精美,特效酷炫!TI9不朽宝藏Ⅰ鉴赏
2019/05/10 DOTA
跟老齐学Python之重回函数
2014/10/10 Python
python编码最佳实践之总结
2016/02/14 Python
发布你的Python模块详解
2016/09/15 Python
Django框架实现的简单分页功能示例
2018/12/04 Python
python3.4 将16进制转成字符串的实例
2019/06/12 Python
浅析PEP570新语法: 只接受位置参数
2019/10/15 Python
如何关掉pycharm中的python console(图解)
2019/10/31 Python
Python sqlalchemy时间戳及密码管理实现代码详解
2020/08/01 Python
Python非单向递归函数如何返回全部结果
2020/12/18 Python
FLOS美国官网:意大利高级照明工艺的传奇
2018/08/07 全球购物
专科毕业生就业推荐信
2013/11/01 职场文书
幼儿园中班开学寄语
2014/04/03 职场文书
我的梦想演讲稿
2014/04/30 职场文书
综合素质自我评价怎么写
2014/09/14 职场文书
法律意见书范文
2015/05/20 职场文书
四年级作文之说明文作文
2019/10/14 职场文书