1. 为什么要开启MySQL慢查询日志
在高并发和海量数据场景下,慢查询日志是诊断数据库性能问题的关键工具。开启该日志可以帮助你快速发现哪些 SQL 的执行时间过长,从而定位瓶颈所在。
通过记录 慢查询,你可以统筹优化方向,例如对常见的长时间查询进行 索引优化、查询改写,以及调整数据库表的结构与配置,从而提升整个平台的吞吐和响应速度。
如果不启用慢查询日志,系统可能在高峰期出现性能下降时看不到任何线索。适当设置阈值和开启日志,是实现持续性能优化的基础步骤。
1.1 快速核对当前日志设置
在正式调整前,先确认现有环境中的 慢查询日志相关状态,以判断是否需要立即启用或调整阈值。
SHOW VARIABLES LIKE 'slow_query_log';
SHOW VARIABLES LIKE 'slow_query_log_file';
SHOW VARIABLES LIKE 'long_query_time';
SHOW VARIABLES LIKE 'log_queries_not_using_indexes';
通过上述信息,你可以看到当前日志是否开启、日志文件位置以及阈值设定,确保后续操作有据可依。
2. 基本概念与关键参数
要正确配置 慢查询日志,需要理解几个关键参数:slow_query_log、slow_query_log_file、long_query_time 和 log_queries_not_using_indexes。这些参数共同决定了哪些查询会被写入日志以及日志的存储方式。
slow_query_log 开关决定是否开启日志记录;slow_query_log_file 指定日志文件路径;long_query_time 是被视为慢查询的阈值(单位:秒);log_queries_not_using_indexes 用于记录未使用索引的慢查询。
另外,日志文件的大小和轮转策略也会影响运维。合理配置后,日志不会对数据库性能产生额外显著负担,同时便于后续分析。
2.1 关键参数含义与取值
在了解含义的基础上,结合实际场景设置合适的阈值。常见做法是将 long_query_time 设置在 1–5 秒之间,具体取值依赖业务复杂度与服务器性能。
SET GLOBAL slow_query_log = ON;
SET GLOBAL slow_query_log_file = '/var/log/mysql/slow.log';
SET GLOBAL long_query_time = 2;
SET GLOBAL log_queries_not_using_indexes = ON;
修改后,可以通过再次查询来确认当前生效的设置:slow_query_log、log_queries_not_using_indexes 和 long_query_time 的最新值。
2.2 日志文件位置与轮转策略
将日志文件放在可监控的位置,并结合系统的轮转策略,避免单个日志文件过大影响读写性能。合理的轮转可以确保历史数据可追溯,同时保持数据库服务器的稳定性。
# 示例:为日志文件设置轮转策略(logrotate 配置片段)
/var/log/mysql/slow.log {dailyrotate 7compressmissingoknotifempty
}
通过这样的轮转配置,慢查询日志在每天生成一个新文件并保留最近 7 天的记录,有助于长期分析与对比。
3. 在运行时开启慢查询日志
如果你暂时不修改配置文件,而希望立即开始记录慢查询,可以在数据库运行时动态开启相关功能。这种方式适用于测试环境或需要快速排查的问题场景。
开启后,日志会自动记录符合阈值条件的查询,并持续写入到指定日志文件中,便于后续分析与诊断。
请注意,运行时修改不会永久生效,重新启动 MySQL 可能会丢失这些设置,除非你将其写入配置文件中。
3.1 开启步骤
使用以下命令在运行时启用慢查询日志并设定初始阈值与日志行为:
SET GLOBAL slow_query_log = ON;
SET GLOBAL slow_query_log_file = '/var/log/mysql/slow.log';
SET GLOBAL long_query_time = 2;
SET GLOBAL log_queries_not_using_indexes = ON;
启用后,可以再次执行 SHOW VARIABLES 来确认当前生效的参数值,确保日志输出到期望的位置。
3.2 动态调整阈值与日志选项
根据实际观测到的慢查询情况,动态地调整阈值和日志范围可以快速改善诊断效率。
SET GLOBAL long_query_time = 1;
SET GLOBAL log_queries_not_using_indexes = ON;
如果系统对日志写入有额外约束,可以临时关闭日志以避免对性能造成影响,方法是:SET GLOBAL slow_query_log = OFF;
4. 在配置文件中开启慢查询日志(mysqld)
为了实现永久性、可复用的配置,需要把慢查询日志相关设置放入 MySQL 的配置文件中,通常是 /etc/my.cnf、my.cnf 或 /etc/mysql/mysql.conf.d/mysqld.cnf 的 [mysqld] 区块。
在配置文件中配置后,重启 MySQL 即可使修改生效。务必确保日志路径具有写权限,并监控磁盘空间,以免日志耗尽系统资源。
4.1 修改配置项
将以下项加入到 [mysqld] 区块中,以实现永久开启与稳定输出:
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 2
log_queries_not_using_indexes = 1
slow_query_log、slow_query_log_file、long_query_time、log_queries_not_using_indexes 将成为永久配置,随服务启动自动生效。
4.2 重启与确认
修改完成后,重启 MySQL 服务以应用新设置,并再次验证日志开启状态。
sudo systemctl restart mysql
systemctl status mysql
重启后,使用 SHOW VARIABLES 命令确认 slow_query_log、slow_query_log_file、long_query_time 的当前值是否符合预期。
5. 慢查询日志的日志文件管理与分析
日志记录完成后,如何高效地管理与分析就成为下一步工作重点。良好的分析流程可以把海量日志转化为可执行的优化行动。
你可以通过日志轮转、归档以及专业分析工具来提升分析效率。结合实际业务场景,建立可持续的慢查询治理流程。

5.1 轮转与归档策略
定期轮转可以防止日志文件过大影响 I/O,保持读写性能;归档则保留历史数据,便于长期趋势分析。
# 示例:使用 logrotate 实现慢查询日志轮转
/var/log/mysql/slow.log {dailyrotate 14compressmissingoknotifempty
}
通过这样的策略,你可以在不影响正常业务的前提下,持续积累可分析的慢查询数据。
5.2 使用分析工具定位热点慢查询
借助分析工具,可以将原始日志转换为可读的查询热点、执行时长分布等信息,帮助你快速定位需要优化的 SQL。
mysqldumpslow -t 10 -s t /var/log/mysql/slow.log
以上命令将按执行时间排序,输出前 10 条慢查询,便于你快速识别最耗时的 SQL。
pt-query-digest /var/log/mysql/slow.log
如果你使用 Percona Toolkit,pt-query-digest 能提供更丰富的统计维度,帮助你做更细粒度的优化。
5.3 针对常见慢查询的优化点
结合执行计划和索引使用情况,优先检查以下方面:缺少索引导致的全表扫描、不合理的联合查询顺序、查询字段类型不匹配、以及 大数据量聚合操作的处理方式。
对于经常出现的慢查询,优先尝试添加覆盖索引、重写 WHERE 条件、避免在 N+1 查询中的重复执行等策略,从而实现显著的性能提升。
5.4 与 Performance Schema 的结合
在新版 MySQL 中,Performance Schema 提供了更细粒度的性能监控能力。将慢查询日志与 Performance Schema 结合,可以在不影响日志输出的情况下,获得更丰富的执行细节与资源使用情况,帮助你做深入的诊断。
