大数跨境
0
0

什么是慢查询日志?如何开启和分析?

什么是慢查询日志?如何开启和分析? Linux运维技术之路
2025-09-28
3
导读:什么是慢查询日志?如何开启和分析?一、慢查询日志:数据库的“黑匣子”和“计时器”慢查询日志是什么?

 










 

什么是慢查询日志?如何开启和分析?

一、慢查询日志:数据库的“黑匣子”和“计时器”

慢查询日志是什么?

想象一下,你的数据库是一个繁忙的超级工厂。每天都有无数的 SQL 订单涌入,要求查询、插入、更新数据。

慢查询日志就像是工厂里的一台高精度计时器行为记录仪

它的核心作用是:记录所有执行时间超过预设阈值的 SQL 语句。

这个“预设阈值”就是 MySQL 的一个核心参数:long_query_time

  • • 默认值: 通常是 10 秒(是的,10秒!这在互联网应用中简直是天荒地老)。
  • • 推荐值: 业界通常建议设置为 1 秒,甚至 0.5 秒

🌟 核心价值: 一旦开启,那些耗时超过   秒的 SQL 语句,连同它们完整的执行信息,都会被无情地记录下来,供你秋后算账!


二、实战演练:如何开启这个“监工模式”?

慢查询日志默认是关闭的(因为它也会消耗一点性能)。我们要做的第一件事,就是去配置文件里把它“请”出来!

1. 临时开启(会话级别,重启失效)

如果你只是想临时测试一下,可以登录 MySQL 客户端执行以下命令:


   
    
   -- 1. 查看当前慢查询状态
SHOW
 VARIABLES LIKE 'slow_query%';

-- 2. 设置慢查询时间阈值(这里设为1秒)

SET
 GLOBAL long_query_time = 1;

-- 3. 开启慢查询日志

SET
 GLOBAL slow_query_log = 'ON';

-- 4. 查看慢查询日志文件位置(通常在data目录下)

SHOW
 VARIABLES LIKE 'slow_query_log_file';

2. 永久开启(推荐!配置文件级别)

要让它在 MySQL 重启后依然生效,你需要编辑 MySQL 的配置文件(通常是 /etc/my.cnf 或 /etc/mysql/mysql.conf.d/mysqld.cnf)。

在 [mysqld] 配置段下,添加或修改以下三行:


   
    
   [mysqld]
# 开启慢查询日志,设为 1 或 ON

slow_query_log
 = 1

# 设置阈值,超过 1 秒的查询将被记录

long_query_time
 = 1

# 指定慢查询日志文件的存储路径

slow_query_log_file
 = /var/log/mysql/mysql-slow.log

⚠️ 记住: 修改配置文件后,一定要重启 MySQL 服务才能生效!


   
    
   # 重启服务 (Linux)
sudo
 systemctl restart mysqld

三、庖丁解牛:如何高效分析日志?

现在日志文件已经在哗啦啦地记录那些“慢 SQL”了,但你不能直接去读一个几百兆甚至几 GB 的纯文本日志文件,那会让你眼花缭乱。

我们需要一个趁手的工具

🔍 神器推荐:mysqldumpslow

MySQL 官方就自带了一个强大的分析工具:mysqldumpslow。它可以对日志文件进行分组、排序、统计,把海量的日志浓缩成一份精华报告

使用示例:


   
    
   # 常用命令:查看排名前10的慢查询,并按查询时间排序
mysqldumpslow -s t -t 10 /var/log/mysql/mysql-slow.log
参数
含义
-s 排序方式。
 常用 t (Time,按查询时间)、c (Count,按查询次数)、r (Rows,按返回行数)
-t Top N。
 只显示排序靠前的多少条记录(比如 t 10 就是前 10 条)

📈 报告解读:定位“问题儿童”

mysqldumpslow 输出的报告是模板化的,它会把所有结构相同的 SQL 归为一类(用 N 代替具体的参数),然后给出关键统计数据:

字段
含义
优化重点
Count
该类 SQL 执行的总次数。
次数越多,优化收益越大!
Time
总耗费时间和平均耗费时间。
越长,问题越大。
Lock
平均锁定时长。
锁长说明表竞争激烈,可能导致其他查询排队。
Rows
平均检查的行数。
检查行数远大于返回行数?极大概率是没走索引!

🛠️ 终极优化:EXPLAIN大法

当你通过慢查询日志锁定了某条特定的“问题 SQL”后,下一步就是使用 EXPLAIN 关键字来分析它的执行计划


   
    
   EXPLAIN SELECT * FROM user WHERE name = '张三';

重点关注 EXPLAIN 结果中的几个指标:

  1. 1. type 表示查询类型,是性能的关键指标。ALL (全表扫描) 是最大的警报!理想值是 consteq_refrefrange
  2. 2. key 实际使用的索引。如果为 NULL,说明根本没用索引!
  3. 3. rows MySQL 估计需要检查的行数。这个数字越小越好。

结语:性能优化,从日志开始!

慢查询日志是数据库性能调优的起点。它不是万能药,但却是帮你找到病灶的最有效诊断工具

从现在开始,开启你的数据库“监工模式”,用数据驱动优化,彻底干掉那些让你系统卡顿的“慢 SQL”吧!

 




 

 


往期回顾


【声明】内容源于网络
0
0
Linux运维技术之路
专注运维架构、高可用、高并发、高性能、大数据、容器化、数据库、python、devops等开源技术和实践的分享。
内容 347
粉丝 0
Linux运维技术之路 专注运维架构、高可用、高并发、高性能、大数据、容器化、数据库、python、devops等开源技术和实践的分享。
总阅读751
粉丝0
内容347