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慢查询的坑
Apr 28 MySQL
Navicat for MySQL的使用教程详解
May 27 MySQL
Unity连接MySQL并读取表格数据的实现代码
Jun 20 MySQL
Prometheus 监控MySQL使用grafana展示
Aug 30 MySQL
浅谈MySQL函数
Oct 05 MySQL
基于MySql验证的vsftpd虚拟用户
Nov 07 MySQL
MySQL中varchar和char类型的区别
Nov 17 MySQL
mysql 联合索引生效的条件及索引失效的条件
Nov 20 MySQL
Mysql分库分表之后主键处理的几种方法
Feb 15 MySQL
MySQL 分区表中分区键为什么必须是主键的一部分
Mar 17 MySQL
如何创建一个创建MySQL数据库中的datetime类型
Mar 21 MySQL
MySQL数据库表约束讲解
Jun 21 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
PHP中使用cURL实现Get和Post请求的方法
2013/03/13 PHP
PHP传参之传值与传址的区别
2015/04/24 PHP
总结PHP中DateTime的常用方法
2016/08/11 PHP
PHP文件操作实例总结【文件上传、下载、分页】
2018/12/08 PHP
兼容Mozilla必须知道的知识。
2007/01/09 Javascript
分享一个asp.net pager分页控件
2012/01/04 Javascript
jQuery圆形统计图开发实例
2015/01/04 Javascript
javascript实现简单计算器效果【推荐】
2016/04/19 Javascript
jQuery实现优雅的弹窗效果(6)
2017/02/08 Javascript
AngularJS中的promise用法分析
2017/05/19 Javascript
JavaScript箭头函数_动力节点Java学院整理
2017/06/28 Javascript
详解用vue编写弹出框组件
2017/07/04 Javascript
浅谈Vue-cli 命令行工具分析
2017/11/22 Javascript
解决vue 打包发布去#和页面空白的问题
2018/09/04 Javascript
jQuery点击页面其他部分隐藏下拉菜单功能
2018/11/27 jQuery
angular 实现下拉列表组件的示例代码
2019/03/09 Javascript
js绘制一条直线并旋转45度
2020/08/21 Javascript
[00:11]战神迅矛
2019/03/06 DOTA
python3设计模式之简单工厂模式
2017/10/17 Python
Django视图之ORM数据库查询操作API的实例
2017/10/27 Python
django上传图片并生成缩略图方法示例
2017/12/11 Python
python实现朴素贝叶斯算法
2018/11/19 Python
python通过tcp发送xml报文的方法
2018/12/28 Python
Python 自动登录淘宝并保存登录信息的方法
2019/09/04 Python
Django框架教程之中间件MiddleWare浅析
2019/12/29 Python
python PIL/cv2/base64相互转换实例
2020/01/09 Python
Numpy中ndim、shape、dtype、astype的用法详解
2020/06/14 Python
python/golang实现循环链表的示例代码
2020/09/14 Python
Java面试题:说出如下代码的执行结果
2015/10/30 面试题
新领导上任欢迎词
2014/01/13 职场文书
员工薪酬激励方案
2014/06/13 职场文书
规范化管理年活动总结
2014/08/29 职场文书
人力资源部岗位职责
2015/02/11 职场文书
党支部书记岗位职责
2015/02/15 职场文书
暑假安全保证书
2015/02/28 职场文书
教师节联欢会主持词
2015/07/04 职场文书