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 12 MySQL
MySQL系列之十二 备份与恢复
Jul 02 MySQL
MySQL Shell import_table数据导入的实现
Aug 07 MySQL
MySQL实例精讲单行函数以及字符数学日期流程控制
Oct 15 MySQL
MySQL窗口函数的具体使用
Nov 17 MySQL
mysql创建存储过程及函数详解
Dec 04 MySQL
MySQL多表查询机制
Mar 17 MySQL
Linux系统下MySQL配置主从分离的步骤
Mar 21 MySQL
数据分析数据库ClickHouse在大数据领域应用实践
Apr 03 MySQL
mysql使用 not int 子查询隐含陷阱
Apr 12 MySQL
MySQL分区以及建索引的方法总结
Apr 13 MySQL
MySQL慢查询中的commit慢和binlog中慢事务的区别
Jun 16 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
一个SQL管理员的web接口
2006/10/09 PHP
超强分页类2.0发布,支持自定义风格,默认4种显示模式
2007/01/02 PHP
php动态实现表格跨行跨列实现代码
2012/11/06 PHP
关于php内存不够用的快速解决方法
2013/10/26 PHP
Yii2.0 RESTful API 基础配置教程详解
2018/12/26 PHP
修改jQuery.Autocomplete插件 支持中文输入法 避免TAB、ENTER键失效、导致表单提交
2009/10/11 Javascript
让iframe子窗体取父窗体地址栏参数(querystring)
2009/10/13 Javascript
Javascript的常规数组和关联数组对比小结
2012/05/24 Javascript
js绑定事件this指向发生改变的问题解决方法
2013/04/23 Javascript
基于MVC3方式实现下拉列表联动(JQuery)
2013/09/02 Javascript
JS关键字球状旋转效果的实例代码
2013/11/29 Javascript
jQuery表单对象属性过滤选择器实例详解
2016/09/13 Javascript
js实现图片左右滚动效果
2017/02/27 Javascript
微信小程序开发打开另一个小程序的实现方法
2020/05/17 Javascript
JS实现数据动态渲染的竖向步骤条
2020/06/24 Javascript
Python程序中的观察者模式结构编写示例
2016/05/27 Python
python中函数传参详解
2016/07/03 Python
Python中运算符"=="和"is"的详解
2016/10/08 Python
Python实现的异步代理爬虫及代理池
2017/03/17 Python
Python解决两个整数相除只得到整数部分的实例
2018/11/10 Python
Python语法分析之字符串格式化
2019/06/13 Python
Python基础学习之时间转换函数用法详解
2019/06/18 Python
Python使用sklearn库实现的各种分类算法简单应用小结
2019/07/04 Python
Python实现的企业粉丝抽奖功能示例
2019/07/26 Python
解决python cv2.imread 读取中文路径的图片返回为None的问题
2020/06/02 Python
使用OpenCV实现人脸图像卡通化的示例代码
2021/01/15 Python
纯CSS3打造属于自己的“小黄人”
2016/03/14 HTML / CSS
亚历山大·王官网:Alexander Wang
2017/06/23 全球购物
美国娱乐和流行文化商品店:FYE
2017/09/14 全球购物
关于递归的一道.NET面试题
2013/05/12 面试题
毕业实习评语
2014/02/10 职场文书
老人祝寿主持词
2014/03/28 职场文书
大学新闻系求职信
2014/06/03 职场文书
2014年施工员工作总结
2014/11/18 职场文书
晚会开幕词范文
2016/03/04 职场文书
python批量更改目录名/文件名的方法
2021/04/18 Python