MySQL慢查询日志怎么开启?定位慢SQL并优化的完整方法

数据库响应变慢是网站运营中最高频的问题之一。排查这类问题,最直接的手段就是打开MySQL的慢查询日志:它会把执行时间超过阈值的SQL语句记录下来,帮你把真正拖慢系统的慢SQL找出来。本文按开启、查看、分析、优化四个环节说明。

mysql慢查询日志开启

慢查询日志是什么,默认开启吗

慢查询日志(Slow Query Log)是MySQL记录超时SQL的日志。默认情况下它是关闭的,并且只有当SQL执行时间超过 long_query_time(默认10秒)时才会被记录。对业务繁忙的站点来说,10秒的阈值偏宽,很多实际影响性能的SQL可能执行1秒就被忽略了,所以建议结合业务调低阈值。

如何开启慢查询日志

临时开启适合线上快速排查,直接在当前会话中执行,重启MySQL后失效:

SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 1;
SET GLOBAL log_queries_not_using_indexes = 'ON';
SHOW VARIABLES LIKE 'slow_query%';
SHOW VARIABLES LIKE 'long_query_time';

如果想永久生效,需要修改配置文件。以my.cnf(或mysqld.cnf)为例,在 [mysqld] 段添加以下内容后重启服务:

[mysqld]
slow_query_log = ON
slow_query_log_file = /var/log/mysql/mysql-slow.log
long_query_time = 1
log_queries_not_using_indexes = ON

需要注意:log_queries_not_using_indexes 会把所有没走索引的查询都记下来,在开发环境很有用,但在生产环境可能产生大量日志,建议按需开启并及时清理。

如何查看与分析慢查询日志

日志是纯文本,可以直接用 mysqldumpslow 统计出最频繁、最耗时的SQL,避免在成千上万条记录里手工翻找:

# 按平均查询时间排序,只看前10条
mysqldumpslow -s at -t 10 /var/log/mysql/mysql-slow.log

# 查看日志文件里最近的内容
tail -n 50 /var/log/mysql/mysql-slow.log

如果日志量很大,也可以用 pt-query-digest 生成更直观的报告,它会把SQL按指纹归类并给出总耗时、平均耗时、出现次数等指标,方便集中精力处理影响最大的那几条。

拿到慢SQL之后如何优化

先看执行计划,确认查询是否走了索引、扫描了多少行:EXPLAIN SELECT …(部分版本可用 EXPLAIN ANALYZE 看真实执行耗时)。绝大多数慢查询都出在下面几类原因上:缺少合适的索引、查询条件里对索引列使用了函数或前置通配符、一次性查出过多字段、大表上做深分页,以及行锁或表锁导致的排队等待。

优化时建议遵循客观、可验证的原则:每改一步,用同样的数据量对比执行时间,避免凭感觉堆索引。索引并非越多越好,写多读少的表上冗余索引反而会拖慢写入和占用磁盘。

相关问答FAQs

  • 问:开启了慢查询日志会影响性能吗?答:影响很小,但日志文件会持续增长,建议配置日志轮转,排查结束后及时关闭 log_queries_not_using_indexes。
  • 问:MySQL 5.7和8.0开启方式有区别吗?答:参数基本一致,8.0默认 slow_query_log 仍为OFF,开启方法相同,可参考官方文档核对参数名。
  • 问:慢查询日志里出现大量同一个SQL怎么办?答:说明该SQL频繁超时,优先优化它,必要时考虑业务侧限流或增加缓存,而不是单纯调大超时时间。

总结来说,慢查询日志是数据库优化的起点而非终点:开启并定期分析,把有限的精力投到执行最频繁、耗时最高的SQL上,配合索引设计与业务改造,才能让数据库长期保持稳定。建议把慢查询日志的开启与分析纳入日常巡检清单,而不是等线上告警了才想起来。

【版权声明】:本站所有内容均来自网络,若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!

(0)
爱家的头像爱家
Nginx访问日志越来越大怎么办?自动切割与定时清理方法详解
上一篇 2026-09-06 00:00
服务器带宽被占满怎么排查?网卡流量监控与定位方法详解
下一篇 2026-09-06 02:01

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

广告合作

QQ:14239236

在线咨询: QQ交谈

邮件:asy@cxas.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信