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 05 MySQL
MySQL入门命令之函数-单行函数-流程控制函数
Apr 05 MySQL
MySQL InnoDB ReplicaSet(副本集)简单介绍
Apr 24 MySQL
MySQL大小写敏感的注意事项
May 24 MySQL
一看就懂的MySQL的聚簇索引及聚簇索引是如何长高的
May 25 MySQL
MySQL中InnoDB存储引擎的锁的基本使用教程
May 26 MySQL
MySQL中IF()、IFNULL()、NULLIF()、ISNULL()函数的使用详解
Jun 26 MySQL
mysql的Buffer Pool存储及原理
Apr 02 MySQL
Mysql InnoDB 的内存逻辑架构
May 06 MySQL
MySQL如何修改字段类型和字段长度
Jun 10 MySQL
MySQL范围查询优化的场景实例详解
Jun 10 MySQL
SQL Server数据库的三种创建方法汇总
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
PHP控制网页过期时间的代码
2008/09/28 PHP
php 验证码实例代码
2010/06/01 PHP
php实现利用phpexcel导出数据
2013/08/24 PHP
php中的curl_multi系列函数使用例子
2014/07/29 PHP
Smarty最简单实现列表奇偶变色的方法
2015/07/01 PHP
PHP多维数组转一维数组的简单实现方法
2015/12/23 PHP
yii去掉必填项中星号的方法
2015/12/28 PHP
收藏一些不常用,但是有用的代码
2007/03/12 Javascript
Js操作Select大全(取值、设置选中等等)
2013/10/29 Javascript
Javascript全局变量var与不var的区别深入解析
2013/12/09 Javascript
ion content 滚动到底部会遮住一部分视图的快速解决方法
2016/09/06 Javascript
走进AngularJs之过滤器(filter)详解
2017/02/17 Javascript
基于vue2.0+vuex+localStorage开发的本地记事本示例
2017/02/28 Javascript
Vue 父子组件、组件间通信
2017/03/08 Javascript
vue+springboot前后端分离实现单点登录跨域问题解决方法
2018/01/30 Javascript
js实现json数组分组合并操作示例
2019/02/12 Javascript
JS字符串常用操作方法实例小结
2019/06/24 Javascript
vue抽出组件并传值实例
2020/07/31 Javascript
javascript实现下拉菜单效果
2021/02/09 Javascript
[54:33]2018DOTA2亚洲邀请赛小组赛 A组加赛 Liquid vs Optic
2018/04/03 DOTA
[50:05]VGJ.S vs OG 2018国际邀请赛淘汰赛BO3 第二场 8.22
2018/08/23 DOTA
使用PYTHON创建XML文档
2012/03/01 Python
简化Python的Django框架代码的一些示例
2015/04/20 Python
Python字典简介以及用法详解
2016/11/15 Python
python实现屏保计时器的示例代码
2018/08/08 Python
python 求10个数的平均数实例
2019/12/16 Python
Python 格式化输出_String Formatting_控制小数点位数的实例详解
2020/02/04 Python
人力资源管理专业应届生求职信
2013/09/28 职场文书
毕业生找工作的自我评价
2013/10/18 职场文书
会展策划与管理专业大学生职业生涯规划
2014/02/07 职场文书
创先争优公开承诺书
2014/08/30 职场文书
邮政竞聘演讲稿
2014/09/03 职场文书
面试通知短信
2015/04/20 职场文书
巴黎圣母院读书笔记
2015/06/26 职场文书
Python中文分词库jieba(结巴分词)详细使用介绍
2022/04/07 Python
前端框架ECharts dataset对数据可视化的高级管理
2022/12/24 Javascript