0

0

mysql如何查看slow query log

P粉602998670

P粉602998670

发布时间:2025-09-27 23:47:01

|

305人浏览过

|

来源于php中文网

原创

要查看MySQL慢查询日志,需先确认是否开启该功能并设置日志路径。通过命令SHOW VARIABLES检查slow_query_log、slow_query_log_file和long_query_time参数,确保其已启用且时间阈值合理(如1秒或更低)。若未开启,需在my.cnf的[mysqld]段中添加slow_query_log=1、指定slow_query_log_file路径并设置long_query_time,同时配置log_output=FILE。修改后重启MySQL服务,并确保日志目录存在且MySQL用户有写入权限。若日志仍不生效,常见原因包括:配置文件非实际加载文件、目录权限不足、未重启服务或long_query_time设置过高。对于大量日志分析,可使用mysqldumpslow按平均时间、执行次数等排序汇总前N条记录,或使用更强大的pt-query-digest生成详细报告,识别高频、高耗时查询及扫描行数多但返回少的问题SQL。慢查询日志不仅是定位性能瓶颈的关键工具,还能指导索引优化、发现应用层低效查询、支持容量规划,并作为运维与开发协同优化的依据,是数据库健康监控不可或缺的部分。

mysql如何查看slow query log

要查看MySQL的慢查询日志,核心操作是确保MySQL配置中开启了慢查询日志功能,并指定了日志文件的位置,之后就可以直接在指定路径下读取这个日志文件了。这就像给数据库装了一个“黑匣子”,专门记录那些运行起来特别耗时的SQL语句,是优化数据库性能的第一步,也是最关键的一步。

解决方案

我的经验告诉我,很多时候,我们发现系统变慢,但又不知道是哪条SQL在捣鬼。慢查询日志就是那个能帮我们揪出“害群之马”的利器。

首先,你需要确认你的MySQL实例是否已经开启了慢查询日志。你可以登录MySQL客户端,运行以下命令:

SHOW VARIABLES LIKE 'slow_query_log';
SHOW VARIABLES LIKE 'slow_query_log_file';
SHOW VARIABLES LIKE 'long_query_time';

slow_query_log 如果是 OFF,那日志自然就不会生成。slow_query_log_file 会告诉你日志文件的具体路径。long_query_time 则定义了查询执行时间超过多少秒才会被记录下来。默认通常是10秒,但对于高并发或响应要求高的系统,我个人倾向于设置成1秒甚至更低,比如0.1秒,这样能更早地发现潜在问题。

如果日志没有开启或者路径不合适,你需要修改MySQL的配置文件 my.cnf(或者 my.ini,取决于你的操作系统)。通常这个文件在 /etc/mysql/my.cnf/etc/my.cnf 或 MySQL安装目录下。

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

[mysqld]
slow_query_log = 1
slow_query_log_file = /var/log/mysql/mysql-slow.log
long_query_time = 1
log_output = FILE

这里 slow_query_log = 1 是开启慢查询日志,slow_query_log_file 指定了日志文件的绝对路径(请确保MySQL用户对这个路径有写入权限),long_query_time = 1 表示执行时间超过1秒的查询都会被记录,log_output = FILE 意味着日志会写入到文件中,而不是表里(当然也可以是TABLE,但FILE更常用)。

修改完配置文件后,务必重启MySQL服务,这样配置才能生效。

# 例如在SystemD系统上
sudo systemctl restart mysql

# 例如在SysVinit系统上
sudo service mysql restart

重启后,等待一段时间,让系统跑起来,如果你的应用中有耗时超过 long_query_time 的查询,慢查询日志文件就会开始记录了。

你可以使用 tail -f /var/log/mysql/mysql-slow.log 命令实时查看日志内容,或者直接用文本编辑器打开它。

为什么我的慢查询日志没有生效?

这问题我被问过太多次了,自己也踩过不少坑。日志没生效,通常不是什么玄学,而是有那么几个常见的原因。

一个很常见的情况是,你修改了 my.cnf,但MySQL并没有加载你修改的那个文件。这在多实例部署或者配置文件路径不标准的环境里特别容易发生。你可以通过 SHOW VARIABLES LIKE 'pid_file'; 找到MySQL当前运行实例的进程ID文件,然后通过 ps -ef | grep mysqld 找到MySQL启动时加载的配置文件路径。确认你修改的是正确的 my.cnf

另一个原因就是权限问题。你指定的 slow_query_log_file 路径,MySQL用户(通常是 mysql 用户)需要有写入权限。如果路径不存在,MySQL可能也无法自动创建。比如你指定 /var/log/mysql/mysql-slow.log,但 /var/log/mysql/ 目录不存在,或者 mysql 用户对 /var/log/mysql/ 没有写入权限,那日志就写不进去。检查目录是否存在,并用 chown mysql:mysql /var/log/mysqlchmod 755 /var/log/mysql 调整权限。

再来就是,你可能改了配置,但忘记重启MySQL服务了。MySQL的很多配置是运行时加载的,但像慢查询日志这种核心功能的开启,通常都需要完全重启才能生效。

long_query_time 的设置也可能导致“没生效”的假象。如果你把它设成了 10 秒,而你的所有查询都很快,没有超过10秒的,那日志文件自然是空的。试着把它调低一些,比如 1 秒,或者在测试环境直接设成 0,看看是否有日志输出。

最后,确认 slow_query_log = 1 是真的写进去了,并且没有被其他配置覆盖。有时候配置文件里会有重复的配置项,MySQL会以最后一个为准。

如何高效分析大量的慢查询日志?

当慢查询日志文件变得庞大时,手动查看就成了噩梦。这时候,我们不能只是盯着原始日志看,而是需要一些工具来帮助我们汇总、分析和定位问题。

Android编程之Bundle及Server、布局等教程 PDF版
Android编程之Bundle及Server、布局等教程 PDF版

内容:使用Bundle在Activity间传递数据、Log与DDMS(查看Log等信息)、Activity生命周期、Android应用开发4使用Service、如何使用服务、服务生命周期、进程生命周期、使用服务进行音乐播放、AndroidUI布局等……

下载

最基础的工具是MySQL自带的 mysqldumpslow。这是一个Perl脚本,可以对慢查询日志进行汇总和排序。

它的用法很简单:

mysqldumpslow -s at -t 10 /var/log/mysql/mysql-slow.log

这个命令的意思是:

  • -s at:按照平均查询时间(Average Time)排序。
  • -t 10:只显示前10条。
  • 其他常用的排序方式还有 c (count, 出现次数), l (lock time, 锁定时间), r (rows sent, 返回行数)。

mysqldumpslow 能给出一些基本的统计信息,比如某个查询模板执行了多少次,总耗时多少,平均耗时多少,锁定了多久,扫描了多少行,返回了多少行。这对于快速发现最“慢”或最“频繁”的查询很有帮助。

然而,mysqldumpslow 的功能相对简单。在更复杂的场景下,我更推荐使用 Percona Toolkit 中的 pt-query-digest。这是一款功能非常强大的慢查询日志分析工具,它可以提供更详细、更丰富的报告,包括:

  • 查询的聚合统计:将相似的查询归类,给出它们的总执行时间、总次数、平均执行时间、最大执行时间等。
  • 详细的查询样本:对于每个聚合的查询,会提供一个实际的查询样本,方便你直接看到具体的SQL语句。
  • 各种百分位数统计:例如P95、P99,能更好地理解查询性能的分布,而不是仅仅看平均值。
  • I/O、锁等待等更深层次的分析。

使用 pt-query-digest 的基本命令:

pt-query-digest /var/log/mysql/mysql-slow.log > slow_query_report.txt

它会生成一个非常详细的文本报告,你可以慢慢研究。通过这份报告,你可以清楚地看到哪些查询是真正的性能瓶颈,它们的执行计划可能存在什么问题,是否缺少合适的索引,或者应用程序的逻辑是否需要调整。

我的经验是,分析日志时,不光要看执行时间最长的,也要关注那些执行次数多但单次耗时不算特别长的查询。因为它们累积起来的总耗时可能非常惊人。同时,也要关注 Rows_examinedRows_sent,如果扫描了大量行但只返回了几行,那通常意味着索引使用不当或全表扫描。

慢查询日志在日常运维中的实际价值是什么?

慢查询日志的价值,远不止是“发现问题”那么简单,它更像是一个数据库的“体检报告”,是日常运维中不可或缺的一部分。

首先,它提供了性能瓶颈的直接证据。当用户抱怨系统卡顿,或者监控系统显示数据库CPU飙高时,慢查询日志就是我们第一时间去查看的“诊断书”。它能直接指出是哪条SQL语句在消耗资源,避免了我们大海捞针式的排查。没有它,我们可能只能凭经验猜测,效率会大打折扣。

其次,它是索引优化的重要依据。很多慢查询的根本原因就是缺少合适的索引,或者索引设计不合理。通过慢查询日志,我们可以找到那些频繁执行且耗时长的查询,然后针对性地分析它们的执行计划(EXPLAIN),从而判断是否需要新建索引、调整现有索引,或者优化查询语句本身。这能极大地提升查询效率,降低数据库负载。

它还能帮助我们审查应用程序代码质量。有时,慢查询并不是数据库的问题,而是应用程序开发者编写了效率低下的SQL语句,比如在大循环中执行N+1次查询,或者使用了不恰当的JOIN。通过慢查询日志,我们可以将这些问题反馈给开发团队,推动代码层面的优化,从源头解决问题。

再者,慢查询日志对容量规划和趋势分析也有参考价值。通过定期分析慢查询日志,我们可以了解数据库的查询模式和负载变化趋势。比如,在某个特定时间段,某些类型的查询开始变慢,这可能预示着数据量增长过快,或者业务高峰期的到来。这有助于我们提前规划资源扩容,避免服务中断。

最后,它也是主动发现潜在问题的有效手段。即使当前系统运行良好,定期查看慢查询日志也能帮助我们发现那些“亚健康”的查询。这些查询可能现在还不是瓶颈,但随着数据量的增长,它们迟早会成为问题。提前发现并优化它们,可以避免未来可能出现的严重故障。

总的来说,慢查询日志不仅仅是一个技术日志,它更是一个沟通的桥梁,连接着运维、开发和业务,共同推动系统性能的持续改进。忽视它,就像开车不看仪表盘一样危险。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

686

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

324

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

348

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

1137

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

359

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

737

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

577

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

420

2024.04.29

c++ 根号
c++ 根号

本专题整合了c++根号相关教程,阅读专题下面的文章了解更多详细内容。

25

2026.01.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MySQL 教程
MySQL 教程

共48课时 | 1.9万人学习

MySQL 初学入门(mosh老师)
MySQL 初学入门(mosh老师)

共3课时 | 0.3万人学习

简单聊聊mysql8与网络通信
简单聊聊mysql8与网络通信

共1课时 | 808人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号