跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
SQLjava

MySQL 慢查询日志完全梳理与实战优化

MySQL 慢查询日志是性能优化的关键入口,记录了执行时间超过阈值的 SQL 及其详细状态。通过配置 slow_query_log、long_query_time 等核心参数,可精准捕获慢 SQL。生产环境推荐使用 mysqldumpslow 或 pt-query-digest 进行日志分析,重点关注 Rows_examined 和 Lock_time 指标。常见误区包括阈值设为 0 导致日志爆炸,需注意异步写入特性及定期清理。优化策略应优先加索引、避免全表扫描及大事务处理,将日志作为定位问题的核心依据而非单纯归档。

DataScient发布于 2026/3/23更新于 2026/9/1067 浏览

MySQL 慢查询日志(Slow Query Log)完全梳理

慢查询日志是 MySQL 性能优化的核心入口之一。几乎所有线上问题、SQL 优化、索引缺失或超时排查,第一步通常都是查看慢查询日志。

下面从零到实战,把慢查询日志相关的核心知识点梳理清楚。

什么是慢查询日志?

简单来说,MySQL 会把执行时间超过某个阈值的 SQL 记录到日志文件里,这个阈值就是 long_query_time。

记录的内容通常包括:

  • 执行时间
  • 锁等待时间
  • 返回的行数
  • 扫描的行数
  • 执行的完整 SQL
  • 执行用户、IP、数据库名
  • 是否使用了索引(using index / using filesort / using temporary)

核心参数

参数名作用默认值推荐线上值修改方式
slow_query_log是否开启慢查询日志OFFON全局动态
slow_query_log_file慢查询日志文件路径主机名-slow.log自定义路径全局动态
long_query_time超过多少秒算慢查询10 秒0.5~2 秒(视业务)全局动态
log_queries_not_using_indexes是否记录未使用索引的查询OFF建议开(排查利器)全局动态
min_examined_row_limit扫描行数少于此值的不记录0一般不动全局动态
log_output日志输出方式(FILE / TABLE)FILEFILE 或 TABLE全局动态

生产环境推荐配置组合:

SET GLOBAL slow_query_log = 1;
SET GLOBAL long_query_time = 1; -- 1 秒以上算慢
SET GLOBAL log_queries_not_using_indexes = 1; -- 没走索引的都记
SET GLOBAL slow_query_log_file = '/data/mysql/slow/slow.log';

怎么查看慢查询日志?

方式一:直接看文件

tail -f /data/mysql/slow/slow.log

典型日志样子如下:

# Time: 2025-02-07T12:34:56.123456Z 
# User@Host: app_user[app_user] @ [192.168.1.100] Id: 12345 
# Query_time: 2.345 Lock_time: 0.000123 Rows_sent: 100 Rows_examined: 1000000 
# Rows_affected: 0 Bytes_received: 0 
SET timestamp=1738922096; 
SELECT * FROM orders WHERE user_id = 123456 ORDER BY create_time DESC LIMIT 10;

关键字段解读:

  • Query_time:执行总耗时
  • Lock_time:等待锁的时间
  • Rows_examined:扫描了多少行(越大越危险)
  • Rows_sent:返回给客户端多少行

方式二:写入 mysql.slow_log 表

SET GLOBAL log_output = 'TABLE';

然后就能用 SQL 查了:

SELECT sql_text, query_time, lock_time, rows_examined, rows_sent, user_host, db, last_seen 
FROM mysql.slow_log 
ORDER BY start_time DESC 
LIMIT 100;

生产环境中如何高效分析慢查询?

常用流程:

  1. 打开慢查询 + 设置合理阈值(1s 或 0.5s)。
  2. 运行一段时间后,使用 mysqldumpslow 工具汇总分析。
# 汇总显示前 20 条最慢的 SQL(按执行次数、耗时排序)
mysqldumpslow -s t -t 20 /data/mysql/slow/slow.log
mysqldumpslow -s c -t 20 /data/mysql/slow/slow.log # 按执行次数排序
  1. 用 pt-query-digest(Percona Toolkit)做更强大的分析。
pt-query-digest /data/mysql/slow/slow.log > digest.txt

它会给你:

  • 总耗时占比
  • 执行次数
  • 平均/最大/最小耗时
  • 95% 响应时间
  • 指纹化的 SQL(自动参数化)
  1. 快速定位 SQL 问题:
    • Rows_examined 很大 → 全表扫描、缺少索引
    • Lock_time 很高 → 行锁、表锁、事务长时间未提交
    • Using filesort / Using temporary → 排序或临时表开销大
    • Query_time 远大于 Lock_time → 可能是 IO 慢、数据量大

常见误区 & 注意事项

  • long_query_time = 0 会记录所有查询(慎用,日志会爆炸)
  • 慢查询日志默认不记录 SELECT SLEEP(10) 这种主动慢查询
  • log_queries_not_using_indexes = ON 非常有用,但会增加少量开销
  • 慢查询日志是异步写的,日志里时间可能比实际执行晚一点
  • 高并发下日志文件可能非常大,建议设置 expire_logs_days 或定期清理
  • 5.7 和 8.0 之后,慢查询日志对复制线程的 SQL 也可以记录(log_slow_replica_statements)

终极建议

  • 开发阶段:本地 / 测试环境把 long_query_time 设成 0.1~0.5 秒,养成看慢查询的习惯
  • 上线前:用 pt-query-digest 过一遍主要接口的 SQL
  • 线上:每天定时分析慢查询(可以结合 ELK、Prometheus + Grafana 做监控)
  • 最常见的优化方向(优先级):
    1. 加索引(最有效)
    2. 避免 select *
    3. 优化 order by / group by
    4. 拆分大事务
    5. 减少扫描行数

一句话总结:慢查询日志不是用来'看日志'的,而是用来'找到最该优化的 SQL'的。

目录

  1. MySQL 慢查询日志(Slow Query Log)完全梳理
  2. 什么是慢查询日志?
  3. 核心参数
  4. 怎么查看慢查询日志?
  5. Time: 2025-02-07T12:34:56.123456Z
  6. User@Host: appuser[appuser] @ [192.168.1.100] Id: 12345
  7. Querytime: 2.345 Locktime: 0.000123 Rowssent: 100 Rowsexamined: 1000000
  8. Rowsaffected: 0 Bytesreceived: 0
  9. 生产环境中如何高效分析慢查询?
  10. 汇总显示前 20 条最慢的 SQL(按执行次数、耗时排序)
  11. 常见误区 & 注意事项
  12. 终极建议

更多推荐文章

查看全部
  • SpringAI Agent 开发实战:基于 Skills 实现代码评审
  • C++ 笔试刷题实战:数字重排、队列约束与二叉树路径和
  • MySQL 库级 DDL 操作详解:创建、修改与删除
  • 华为 OD 机试双机位 C 卷 - 评委评分算法题
  • 无人机远程识别(RemoteID)支持情况汇总
  • C 语言指针与复杂数据结构:链表、栈与队列实现
  • 深入解析 LRU 与 LFU 缓存算法原理及实现
  • WebP 图像格式详解:性能、兼容性与实战应用
  • CCF-CSP 第 38 次认证第二题:机器人复健指南
  • 基于 FPGA 的四线 SPI Flash 读写设计(Verilog)
  • 智能车电磁组进阶:ADC 信号处理与差比和差算法
  • PyTorch 实战:基于文本引导的图像生成与 Stable Diffusion 实践
  • 评估微调后大模型实际业务效果的性能指标有哪些
  • JDK 23 本地环境搭建与配置指南
  • 基于 Spring Cloud 的分布式智能推荐系统架构与实践
  • Python 金融量化分析师入门指南与职业发展路径
  • 基于 YOLO26 的无人机视角路面病害检测识别系统
  • AIGC 时代如何打造卓越的技术文档
  • MySQL 为什么用 B+ 树,Redis ZSet 为什么用跳表?
  • C++11 核心特性详解:列表初始化、新式声明、范围 for 与 STL 变化

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • SQL 美化和格式化

    在线格式化和美化您的 SQL 查询(它支持各种 SQL 方言)。 在线工具,SQL 美化和格式化在线工具,online

  • SQL转CSV/JSON/XML

    解析 INSERT 等受限 SQL,导出为 CSV、JSON、XML、YAML、HTML 表格(见页内语法说明)。 在线工具,SQL转CSV/JSON/XML在线工具,online