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 22 MySQL
MySQL 分页查询的优化技巧
May 12 MySQL
MySQL8.0无法启动3534的解决方法
Jun 03 MySQL
MySQL 如何设计统计数据表
Jun 15 MySQL
MySQL一些常用高级SQL语句
Jul 03 MySQL
MySQL里面的子查询的基本使用
Aug 02 MySQL
SQL语法CONSTRAINT约束操作详情
Jan 18 MySQL
SQL基础查询和LINQ集成化查询
Jan 18 MySQL
MySQL中int (10) 和 int (11) 的区别
Jan 22 MySQL
MySQL多表查询机制
Mar 17 MySQL
mysql中数据库覆盖导入的几种方式总结
Mar 25 MySQL
MySQL数据库查询进阶之多表查询详解
Apr 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
php循环检测目录是否存在并创建(循环创建目录)
2011/01/06 PHP
PHP实现支付宝即时到账功能
2016/12/21 PHP
js 学习笔记(三)
2009/12/29 Javascript
javascritp添加url参数将参数加入到url中
2014/09/25 Javascript
详解JavaScript中的Unescape()和String() 函数
2015/11/09 Javascript
浅谈bootstrap源码分析之scrollspy(滚动侦听)
2016/06/06 Javascript
JS声明式函数与赋值式函数实例分析
2016/12/13 Javascript
js自制图片放大镜功能
2017/01/24 Javascript
Vue框架中正确引入JS库的方法介绍
2017/07/30 Javascript
vue.js声明式渲染和条件与循环基础知识
2017/07/31 Javascript
使用重写url机制实现验证码换一张功能
2017/08/01 Javascript
Vue2 模板template的四种写法总结
2018/02/23 Javascript
vue左侧菜单,树形图递归实现代码
2018/08/24 Javascript
浅谈vue后台管理系统权限控制思考与实践
2018/12/19 Javascript
深度了解vue.js中hooks的相关知识
2019/06/14 Javascript
vue实现select下拉显示隐藏功能
2019/09/30 Javascript
vue 使用 canvas 实现手写电子签名
2020/03/06 Javascript
深入分析JavaScript 事件循环(Event Loop)
2020/06/19 Javascript
Vue+Java 通过websocket实现服务器与客户端双向通信操作
2020/09/22 Javascript
JavaScript点击按钮生成4位随机验证码
2021/01/28 Javascript
使用python 获取进程pid号的方法
2014/03/10 Python
python实现的文件夹清理程序分享
2014/11/22 Python
TensorFlow在MAC环境下的安装及环境搭建
2017/11/14 Python
dataframe设置两个条件取值的实例
2018/04/12 Python
Django模板标签{% for %}循环,获取制定条数据实例
2020/05/14 Python
解决pycharm修改代码后第一次运行不生效的问题
2021/02/06 Python
美国睫毛、眉毛精华液领导品牌:RevitaLash Cosmetics
2018/03/26 全球购物
美国最大的高尔夫发球时间预订网站:TeeOff.com
2018/03/28 全球购物
总经理助理岗位职责
2013/11/08 职场文书
12月小学生校园广播稿
2014/02/04 职场文书
机电一体化应届生求职信
2014/08/09 职场文书
第二批党的群众路线教育实践活动个人整改方案
2014/10/31 职场文书
企业安全生产检查制度
2015/08/06 职场文书
React中的Context应用场景分析
2021/06/11 Javascript
CSS实现单选折叠菜单功能
2021/11/01 HTML / CSS
继承Win10缺点!教你关闭Win11烦人的网络搜索
2021/11/23 数码科技