数据库的“病历本”——如何用好慢查询日志定位性能瓶颈

本文涉及的产品
PolarDB Agent Express,2核4GB
PolarDB Agent Flow,2核4GB
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
简介: 本文详解MySQL慢查询日志的开启、配置与分析实战,涵盖`long_query_time`、`log_queries_not_using_indexes`等关键参数,推荐使用`pt-query-digest`精准定位全表扫描、索引失效、隐式转换等典型性能瓶颈,并给出索引优化与系统化调优流程,助DBA从“救火”迈向主动防控。

关键词​:慢查询日志;性能优化;索引;全表扫描;pt-query-digest;MySQL


大家好,我是小耶,写功课只是为了我踩过的坑,你们别再踩了!

你有没有遇到过这种情况:数据库突然变慢,业务方一直催,你打开监控看到CPU飙高,但不知道是哪个SQL惹的祸。这时候,慢查询日志就是你的“病历本”——它记录了所有执行时间超过阈值的SQL,以及它们的执行计划、锁等待、扫描行数等关键信息。用好慢查询日志,是DBA从“被动救火”走向“主动优化”的第一步。

今天就聊聊:慢查询日志怎么开?怎么看?怎么从日志里找到真正的性能瓶颈?

一、慢查询日志是什么?

慢查询日志是MySQL提供的一种记录执行时间超过指定阈值的SQL语句的日志。你可以把它理解成数据库的“病历本”——哪条SQL“生病”了(跑得慢),它就记下来。日志内容包括:执行时间、锁等待时间、扫描行数、返回行数、使用的索引、用户来源等。

二、如何正确开启和配置

慢查询日志默认是关闭的,生产环境建议开启,但要注意性能开销(写入日志本身也会消耗IO)。

核心参数:

  • slow_query_log:是否开启慢查询日志(ON/OFF)
  • slow_query_log_file:日志文件路径
  • long_query_time:慢查询阈值,单位秒,建议设置为0.1-1秒(根据业务调整)
  • log_queries_not_using_indexes:是否记录没有使用索引的查询(强烈建议开启)
  • log_slow_admin_statements:是否记录慢的管理语句(如OPTIMIZE TABLE)

设置示例:

SET GLOBAL slow_query_log = ON;
SET GLOBAL long_query_time = 0.5;
SET GLOBAL log_queries_not_using_indexes = ON;
SET GLOBAL slow_query_log_file = '/var/log/mysql/slow.log';

需要注意的是,long_query_time 设置得越小,记录的SQL越多,日志文件膨胀越快。建议先用1秒观察,再逐步降低。另外,log_queries_not_using_indexes 开启后,即使查询很快,只要没走索引也会被记录,这对发现索引缺失非常有帮助。

三、如何分析慢查询日志

最原始的方式是直接用文本编辑器打开慢查询日志文件,但几百MB甚至GB的文件根本看不过来。推荐使用专业工具:

1. mysqldumpslow(MySQL自带)

# 按平均执行时间排序,取前10条
mysqldumpslow -s at -t 10 /var/log/mysql/slow.log

常用排序参数:

  • -s c:按总次数排序
  • -s t:按总时间排序
  • -s at:按平均时间排序
  • -s l:按锁等待时间排序

2. pt-query-digest(Percona Toolkit,推荐)

pt-query-digest /var/log/mysql/slow.log

输出结果非常详细,会按查询指纹聚合,显示每个查询的总执行次数、平均时间、最长时间、扫描行数、返回行数比例等,还会给出优化建议。

3. 如果慢查询日志文件巨大​,可以先用 head -n 1000 截取一部分样本分析,或者用 grep 筛选特定时间段。

4. 可视化工具​:例如金仓数据库自带的KStudio智能诊断模块,可以自动解析慢查询日志,用图表展示高频慢SQL的分布和执行时间趋势,并给出索引推荐。这类工具对于不熟悉命令行的DBA来说比较友好。

四、从日志中能看出哪些问题?

以下是几种典型慢查询日志片段及对应的问题分析:

案例1:全表扫描

# Query_time: 12.5  Lock_time: 0.1  Rows_sent: 10  Rows_examined: 5000000
SELECT * FROM orders WHERE status = 'PENDING';
  • Rows_examined 远超 Rows_sent,说明扫描了大量行才返回少量数据。
  • 大概率 status 列没有索引,或者索引选择性太差(status只有几个值)。
  • 优化方向:给 status 加索引,或者考虑复合索引(status + 其他常用过滤条件)。

案例2:索引失效(隐式类型转换)

# Query_time: 8.2  Rows_examined: 2000000
SELECT * FROM user WHERE mobile = 13800138000;
  • mobile字段定义为VARCHAR,但查询中用了数字常量,导致索引失效。
  • 优化方向:改为 WHERE mobile = '13800138000'(加引号)。

案例3:排序不合理

# Query_time: 15.0  Rows_examined: 1000000
SELECT * FROM product ORDER BY sales DESC LIMIT 10;
  • ORDER BY sales DESC 导致文件排序(filesort),没有使用索引。
  • 优化方向:在sales列上建立索引,或者使用覆盖索引。

案例4:没有使用索引的查询(log_queries_not_using_indexes开启后捕获)

# Query_time: 0.3  Rows_examined: 500000
SELECT id, name FROM category WHERE parent_id = 10;
  • 虽然执行时间不到1秒,但扫描了50万行,是因为没有走索引。
  • 优化方向:给parent_id建立索引。

五、系统化的优化流程

  1. 设置基线​:记录当前慢查询数量和平均响应时间,作为优化前后的对比依据。
  2. 收集样本​:开启慢查询日志,收集一段时间(如1天)的代表性流量。
  3. 分析排序​:用pt-query-digest找出最“昂贵”的SQL(按总时间或平均时间排序)。
  4. 逐个击破​:针对TOP 5-10的慢查询,查看执行计划(EXPLAIN),分析索引使用情况,进行SQL改写或索引调整。
  5. 验证效果​:上线后观察慢查询日志的变化,确认问题是否解决。
  6. 持续监控​:建议将慢查询日志采集到监控系统(如Prometheus + Grafana),设置告警规则(如每分钟慢查询超过10条则报警)。

六、注意事项与误区

  • 不要只看平均时间​:有些SQL执行频率极高,即使每次只花0.01秒,累积起来也可能是大头。pt-query-digest的总时间排序可以帮你看清楚。
  • 日志文件过大的处理​:可以配置日志轮转(如logrotate),定期清理或归档。
  • 不要在MySQL内部长期开启全量慢查询​:建议采样开启(如每天开启1小时),或者使用performance_schema的更精细监控。
  • 慢查询少了不等于优化完成​:还需要看QPS、TPS、锁等待等指标,避免因优化过度导致其他问题。

七、总结

慢查询日志是DBA最基础也最强大的工具之一。它记录了数据库的“健康问题”,是性能优化的起点。用好它,你可以从“救火队员”变成“预防医生”——在业务投诉之前,主动发现并解决性能隐患。配合自动化分析工具,甚至可以建立慢查询的持续监控和告警体系,让数据库的性能问题无所遁形。

小耶在手,SQL 不愁

还有什么想了解的,欢迎留言!小耶一定知无不言言无不尽……我们下次见~

相关文章
|
15天前
|
人工智能 自然语言处理 文字识别
阿里云百炼Qwen3.7-Max简介:能力、优势、支持订阅计划参考
Qwen3.7-Max是阿里云百炼面向智能体时代推出的新一代旗舰模型,对标GPT-5.5、Claude Opus 4.7等闭源旗舰。该模型支持百万级token上下文窗口,具备顶级推理能力、多模态搜索与视觉理解增强、流式输出低延迟响应等核心优势,覆盖编程、办公、长周期自主执行等复杂场景。同时支持OpenAI接口兼容,便于系统快速迁移。用户可通过Token Plan团队或节省计划等订阅方式灵活调用,适合企业级高要求场景使用。
5716 29
阿里云百炼Qwen3.7-Max简介:能力、优势、支持订阅计划参考
|
10天前
|
存储 定位技术 数据库
CodeGraph 如何让 Claude Code减少 7 成工具调用?
CodeGraph 为 Coding Agent 提供本地代码知识图谱,把函数、类、调用链和框架路由提前整理成“项目地图”,减少盲目搜索和文件读取。它不是新 Agent,而是上下文基础设施,让 Agent 更快找到正确代码路径,平均减少 7 成工具调用。
1163 2
|
7天前
|
人工智能 安全 定位技术
CodeGraph深度解析 让Claude Code工具调用直降七成的核心原理与实操教程
如今以Claude Code为代表的AI编程智能体已经成为开发者日常编码、项目重构、漏洞修复的必备工具。但在长期使用过程中,几乎所有开发者都会遇到同一个明显痛点:AI虽然具备强大的代码生成与分析能力,却常常陷入盲目探索的循环中。
924 1
|
17天前
|
人工智能 自然语言处理 供应链
|
7天前
|
人工智能 弹性计算 安全
阿里云618活动时间、活动入口、优惠活动详细解读
2026年阿里云618创新加速季已全面开启,作为年度力度最大的云产品促销活动,本次大促覆盖轻量应用服务器、ECS云服务器、GPU云服务器、数据库、AI算力、安全服务、CDN等全品类产品,推出5亿元算力补贴、新用户限时秒杀、普惠满减、企业专享、免费试用、云大使返佣等多重福利,个人开发者、中小企业、AI团队均可享受专属低价。本文将系统梳理2026年阿里云618活动的完整时间节点、官方参与入口、各类优惠细则、使用规则、热门产品推荐及实操代码,帮助用户精准参与、高效省钱,以最低成本完成上云部署。
702 3
|
23天前
|
人工智能 开发工具 iOS开发
Claude Code 新手完全上手指南:安装、国产模型配置与常用命令全解
Claude Code 是一款运行在终端环境中的 AI 编程助手,能够直接在命令行中完成代码生成、项目分析、文件修改、命令执行、Git 管理等开发全流程工作。它最大的特点是**任务驱动、终端原生、轻量高效、多模型兼容**,无需图形界面、不依赖 IDE 插件,能够深度融入开发者日常工作流。
3825 15
|
8天前
|
运维
欢迎报名|2026 Agentic AICon—智能体基础设施与AgentOps专场,邀您参会
欢迎报名|2026 Agentic AICon—智能体基础设施与AgentOps专场,邀您参会
1419 0