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

本文涉及的产品
PolarSearch,搜索节点 4核8GB
RDS AI 助手,专业版
PolarDB Agent Express,2核4GB
简介: 本文详解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 不愁

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

相关文章
|
1月前
|
SQL 运维 关系型数据库
DBA必备技能:MySQL误删恢复完全指南(全量备份+binlog回放)
本文详解误删数据(如`DELETE FROM orders`)后的紧急恢复三步法:查Binlog→临时库回放→差异导回,并附4条血泪预防措施。不讲段子,只教能救命的操作!
|
4天前
|
SQL 关系型数据库 MySQL
执行计划进阶:读懂统计信息与基数估算,理解优化器的“思考方式”
执行计划是SQL优化的核心工具,但很多人只关注type和Extra,忽略了执行计划背后的决策依据——统计信息与基数估算。本文从优化器的决策逻辑出发,解释统计信息如何影响基数估算、基数估算如何决定执行计划的选择。通过真实案例展示统计信息过旧如何导致优化器“选错路”,以及如何通过更新统计信息、使用扩展统计等方法来纠正。帮助读者从“看懂执行计划”进阶到“理解优化器为什么这么选”。
|
15天前
|
SQL 人工智能 自然语言处理
Vibe Coding 是什么?当“感觉编程”遇上数据库
Vibe Coding是2026年编程圈最火的概念之一,指开发者通过自然语言描述“感觉”或“意图”,由AI自动生成代码、调试、优化。本文从Vibe Coding的起源讲起,分析它如何改变数据库开发方式:从手写SQL到自然语言查询、从人工调索引到AI推荐、从经验运维到智能诊断。探讨这项趋势对DBA职业的影响,并给出拥抱变化的实用建议。技术会变,但人的判断力、审美和业务理解才是长期竞争力。
|
5天前
|
人工智能 Cloud Native 关系型数据库
MySQL 8.4 LTS来了!从8.0到8.4,DBA必须知道的5个核心变化
MySQL 8.0社区版将于2026年结束生命周期,8.4 LTS作为首个长期支持版本,提供5年超长支持周期(至2031年)。本文从InnoDB并行查询、Redo Log动态容量、默认认证插件变更、参数默认值调整、云原生适配五个维度,梳理DBA升级前必须掌握的核心变化,并提供升级检查清单。
|
10天前
|
SQL 运维 自然语言处理
国产向量数据库有哪些?两大技术流派深度对比与选型指南
向量数据库是2026年数据库领域增长最快的细分赛道之一。本文从RAG应用和企业知识库的实际需求出发,系统梳理国产向量数据库的两大技术流派——独立向量数据库与融合型向量数据库,深入对比两者的架构差异、适用边界和选型逻辑。
|
11天前
|
SQL 关系型数据库 MySQL
从索引设计到执行计划:一条慢查询的“体检”全流程
慢查询优化不是孤立地看执行计划,而是要从索引设计、执行计划解读、统计信息更新到SQL改写形成完整闭环。本文从一条真实的慢查询出发,串联索引设计原则、执行计划关键字段的诊断价值、统计信息对优化器的影响,以及验证优化的标准流程,帮助读者建立系统化的SQL性能优化方法论。
|
12天前
|
SQL 关系型数据库 MySQL
SQL优化进阶:读懂执行计划,告别慢查询焦虑
慢查询优化的第一步不是猜索引,而是读懂执行计划。本文从执行计划的生成原理出发,系统讲解type、key_len、rows、filtered、Extra五个核心字段的业务含义和诊断价值。通过典型案例揭示全表扫描、索引失效、文件排序、临时表等常见性能陷阱的判定方法,并给出标准化的优化排查流程。帮助开发者从“凭感觉优化”升级到“基于证据优化”。
|
16天前
|
存储 SQL 关系型数据库
索引优化深潜(下):索引合并、ICP 与索引设计的实战法则
索引优化不止于单索引设计。本文深入讲解MySQL 5.6/8.0的高级索引特性:索引合并(Index Merge)的三种策略(交集、并集、排序并集)、索引条件下推(ICP)的工作原理和适用场景,以及如何使用MRR(多范围读取)优化随机I/O。通过真实案例演示如何利用这些特性提升查询性能,同时揭示索引合并可能带来的隐患。最后总结索引设计实战法则,帮助你从“能用索引”进阶到“用好索引”。
|
16天前
|
SQL 人工智能 运维
向量数据库详解:RAG 系统的核心引擎与多模态检索
向量数据库是RAG和多模态AI的核心引擎。本文解释向量嵌入、相似性检索、HNSW索引等核心概念,对比专用向量库与融合数据库的差异,给出选型建议。
|
16天前
|
SQL 关系型数据库 索引
索引优化深潜(上):InnoDB 索引结构、Cardinality 与索引策略
索引是SQL性能优化的核心,但很多人只停留在“建索引就行”的层面。本文从InnoDB的B+Tree索引结构出发,深入讲解聚簇索引与二级索引的区别、回表机制、索引覆盖、最左前缀原则、Cardinality(基数)对优化器决策的影响。通过多个案例演示如何利用Cardinality判断索引选择性,以及为什么有时候优化器会放弃使用索引。读完本文,你将能精准设计复合索引顺序,并理解优化器的索引选择逻辑。