当前位置:网站首页>手把手教你定位线上MySQL慢查询问题,包教包会
手把手教你定位线上MySQL慢查询问题,包教包会
2022-08-03 19:04:00 【肥肥技术宅】
1. 慢查询日志的作用
慢查询日志默认不开启,建议手动开启,方便我们定位线上问题。
执行时间超过阈值的SQL会被写入到慢查询日志当中,这样可以帮助我们记录执行时间过长的SQL语句,定位线上慢SQL问题,方便我们进行SQL性能调优。
2. 慢查询日志的配置
2.1 查看是否开启了慢查询日志
show variables like 'slow_query_log'; 复制代码

默认是OFF,不开启,可以手动开启。
2.2 开启慢查询日志
一种方法是可以使用MySQL命令开启:
set global slow_query_log=1; 复制代码

另一种方法是修改MySQL配置文件,重新MySQL服务后,开启。
修改配置文件my.cnf,加入下面一行命令
slow_query_log = ON
2.3 设置慢查询日志的阈值
慢查询日志的阈值默认是10,单位是秒。
对于线上服务来说,10秒太长了,我们可以手动修改。

一种是通过MySQL命令修改,比如修改为1秒:
set long_query_time=1; 复制代码

另一种方法是修改MySQL配置文件,重新MySQL服务后,开启。
修改配置文件my.cnf,加入下面一行命令
long_query_time = 1
2.4 修改慢查询日志位置
使用MySQL命令查看慢查询日志位置:
show variables like '%slow_query_log_file%'; 复制代码

想要修改慢查询日志位置,可以修改MySQL配置文件,重新MySQL服务后,开启。
修改配置文件my.cnf,加入下面一行命令
slow_query_log_file = /usr/local/mysql/data/localhost_slow.log
2.5 记录更多慢查询SQL
默认情况下管理语句是不会被记录到慢查询日志中,管理语句包括ALTER TABLE、 ANALYZE TABLE、 CHECK TABLE、 CREATE INDEX、 DROP INDEX、 OPTIMIZE TABLE和 REPAIR TABLE等。

管理语句也是非常重要的,如果想要被记录,可以通过MySQL命令修改:
set global log_slow_admin_statements=ON; 复制代码

默认情况下,不使用索引的语句,也是不会被记录的。
够坑人吧!一不留神就掉坑里了,不记录不使用索引的语句,还要慢查询日志干嘛?

想要记录不使用索引的语句,可以通过命令修改:
set global log_queries_not_using_indexes=ON; 复制代码

3. 慢查询日志的使用
手动造一条慢SQL,测试一下效果,user表中有100万表数据:
select * from user; 复制代码
然后看一下慢查询日志文件的内容:
cat /usr/local/mysql/data/localhost_slow.log 复制代码

SQL语句和执行时间都被记录了。
4. 分析慢查询日志
有时候慢查询日志较多,手动查看起来并不是很方便,好在MySQL提供了分析慢查询日志的工具 mysqldumpslow 。
常用参数有 -s: 表示按何种方式排序: c: 访问次数 l: 锁定时间 r: 返回记录 t: 查询时间 al: 平均锁定时间 ar: 平均返回记录数 at: 平均查询时间 -t: 返回前面多少条的数据; 复制代码
4.1 查询返回结果最多的10条SQL:
mysqldumpslow -s r -t 10 /usr/local/mysql/data/localhost_slow.log

4.2 查询耗时最长的10条SQL:
mysqldumpslow -s t -t 10 /usr/local/mysql/data/localhost_slow.log


边栏推荐
- 2022/08/02------Ugly number
- C#爬虫之通过Selenium获取浏览器请求响应结果
- Postgresql源码(65)新快照体系Globalvis工作原理分析
- 货比四家 version tb1.63
- idea——同一项目开启多个实例(不同端口)
- Confused!Ali was abused on the one hand, but was fortunate to be promoted to Huawei's technology, and successfully got the offer, with an annual salary of 40w
- 力扣刷题之移动零
- Postgresql-xl全局快照与GTM代码走读(支线)
- 阿里二面:多线程间的通信方式有几种?举例说明
- Web项目Controller统一返回实体类
猜你喜欢

Cobalt Strike (CS) 逆向初探

图像超分——Real-ESRGAN快速上手

【夜莺监控方案】08-监控msyql集群(prometheuse+n9e+mysqld_exporter)

Zhong Hua, senior architect of Ali: China-Taiwan strategic thinking and architecture practice; including internal implementation manual

MySQL详细学习教程(建议收藏)

Redis:哨兵

Bytes to beat three sides take offer: network + GC + + IO + redis + JVM red-black tree + data structure, to help you quickly into the giant!!!!!

设备树基本原理与操作方法

Difference差分数组

2022年最新的Android面试大厂必考174题(附带详细答案)
随机推荐
Bytes to beat three sides take offer: network + GC + + IO + redis + JVM red-black tree + data structure, to help you quickly into the giant!!!!!
【C语言学习笔记(七)】C语言重定向输入与输出
如何理解即时通讯开发移动网络的“弱”和“慢”
InnoDB 中不同SQL语句设置的锁
盲僧发现了华点——教你如何使用API接口获取数据
Postgresql源码(64)查询执行——子模块Executor(2)执行前的数据结构和执行过程
docker mysql 容器中执行mysql脚本文件并解决乱码
X86函数调用模型分析
Postgresql快照优化Globalvis新体系分析(性能大幅增强)
MySQL【变量、流程控制与游标】
Compose原理-compose中是如何实现事件分法的
C#爬虫之通过Selenium获取浏览器请求响应结果
vulnhub pyexp: 1
U-Net生物医学图像分割讲解(Convolutional Networks for BiomedicalImage Segmentation)
Big guy, who is free to help me to see what the problem is, I just read MySQL source print, and I just came into contact with flink.
MySQL 啥时候用表锁,啥时候用行锁?这些你都应该知道吧
不要小看 WebSocket!长连接、有状态、双向、全双工都是王炸技能
红日安全内网渗透靶场-VulnStack-1
软件测试技术之如何编写测试用例(3)
力扣刷题之移动零