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 相关文章推荐
仅用一句SQL更新整张表的涨跌幅、涨跌率的解决方案
May 06 MySQL
MySQL查询学习之基础查询操作
May 08 MySQL
详解MySQL数据库千万级数据查询和存储
May 18 MySQL
MySQL中的布尔值,怎么存储false或true
Jun 04 MySQL
MySQL开启事务的方式
Jun 26 MySQL
MySQL 如何限制一张表的记录数
Sep 14 MySQL
一篇文章看懂MySQL主从复制与读写分离
Nov 07 MySQL
mysql中varchar类型的日期进行比较、排序等操作的实现
Nov 17 MySQL
Mysql存储过程、触发器、事件调度器使用入门指南
Jan 22 MySQL
MySQL中一条update语句是如何执行的
Mar 16 MySQL
MySQL事务操作的四大特性以及并发事务问题
Apr 12 MySQL
Mysql 文件配置解析介绍
May 06 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
1982年日本摄影师镜头下的中国孩子 那无忧无虑的童年
2020/03/12 杂记
PHP脚本数据库功能详解(中)
2006/10/09 PHP
php中的注释、变量、数组、常量、函数应用介绍
2012/11/16 PHP
浅谈php正则表达式中的非贪婪模式匹配的使用
2014/11/25 PHP
weiphp微信公众平台授权设置
2016/01/04 PHP
PHP中ltrim与rtrim去除左右空格及特殊字符实例
2016/01/07 PHP
利用Homestead快速运行一个Laravel项目的方法详解
2017/11/14 PHP
PHP使用mysqli同时执行多条sql查询语句的实例
2019/03/22 PHP
通过PHP的Wrapper无缝迁移原有项目到新服务的实现方法
2020/04/02 PHP
jQuery load方法用法集锦
2011/12/06 Javascript
jquery移除、绑定、触发元素事件使用示例详解
2014/04/10 Javascript
javascript中in运算符用法分析
2015/04/28 Javascript
Bootstrap表单Form全面解析
2016/06/13 Javascript
AngularJS获取json数据的方法详解
2017/05/27 Javascript
20170918 前端开发周报之JS前端开发必看
2017/09/18 Javascript
vue中使用vue-print.js实现多页打印
2020/03/05 Javascript
vue使用vue-quill-editor富文本编辑器且将图片上传到服务器的功能
2021/01/13 Vue.js
[03:34]2014DOTA2西雅图国际邀请赛 淘汰赛7月15日TOPPLAY
2014/07/15 DOTA
Python中optparse模块使用浅析
2015/01/01 Python
Python生成不重复随机值的方法
2015/05/11 Python
python 3利用BeautifulSoup抓取div标签的方法示例
2017/05/28 Python
Python求解任意闭区间的所有素数
2018/06/10 Python
Python根据文件名批量转移图片的方法
2018/10/21 Python
Python操作远程服务器 paramiko模块详细介绍
2019/08/07 Python
详解使用PyInstaller将Pygame库编写的小游戏程序打包为exe文件
2019/08/23 Python
Tensorflow中的dropout的使用方法
2020/03/13 Python
Html5 滚动穿透的方法
2019/05/13 HTML / CSS
PHP两种查询函数array/row的区别
2013/06/03 面试题
电子商务专业个人的自我评价分享
2013/10/29 职场文书
办公文员的工作岗位职责
2013/11/12 职场文书
餐饮加盟计划书
2014/01/10 职场文书
2014年五四青年节活动方案
2014/03/29 职场文书
高中英语演讲稿范文
2014/04/24 职场文书
老干部工作先进集体事迹材料
2014/05/21 职场文书
培养联系人考察意见
2015/06/01 职场文书
初中运动会闭幕词范本3篇
2019/12/09 职场文书