2. 慢查询日志基础:MySQL慢查询日志的配置与开启方法
慢查询日志(Slow Query Log)是MySQL提供的一种基础但极其重要的性能诊断工具。它能够记录执行时间超过指定阈值的SQL语句,是定位数据库性能瓶颈、降低搜索服务尾延迟压测波动的第一道防线。本章将详细讲解慢查询日志的核心参数、配置方法以及验证手段。
2.1 核心参数详解
慢查询日志的行为由一组系统变量控制。以下表格列出了最关键的参数及其作用:
| 参数名 | 作用域 | 默认值 | 说明 |
|---|---|---|---|
slow_query_log |
全局/会话 | OFF | 慢查询日志的总开关。设置为ON时启用日志记录。 |
slow_query_log_file |
全局 | 主机名-slow.log | 日志文件的存储路径和文件名。建议使用绝对路径。 |
long_query_time |
全局/会话 | 10.000000 | SQL执行时间的阈值(秒)。超过此值的语句将被记录。 |
log_queries_not_using_indexes |
全局 | OFF | 是否记录未使用索引的查询。对发现全表扫描非常有用。 |
log_slow_admin_statements |
全局 | OFF | 是否记录慢管理语句(如ALTER TABLE、ANALYZE TABLE)。 |
min_examined_row_limit |
全局/会话 | 0 | 查询检查行数超过此值才被记录。可与long_query_time配合使用。 |
实践要点:在压测环境中,建议将
long_query_time 设置为 0.1 秒(100毫秒)甚至更低,以便捕获所有可能影响尾延迟的慢查询。生产环境则建议从 1 秒开始,逐步调低。
2.2 配置与开启方法
配置慢查询日志有两种方式:动态配置(无需重启MySQL)和静态配置(写入配置文件)。
2.2.1 动态配置(推荐用于压测环境)
通过MySQL客户端执行SET命令,立即生效,但重启后失效。
-- 1. 开启慢查询日志
SET GLOBAL slow_query_log = ON;
-- 2. 设置日志文件路径(确保MySQL用户有写入权限)
SET GLOBAL slow_query_log_file = '/var/log/mysql/slow_query.log';
-- 3. 设置慢查询阈值(0.2秒)
SET GLOBAL long_query_time = 0.2;
-- 4. 记录未使用索引的查询
SET GLOBAL log_queries_not_using_indexes = ON;
-- 5. 记录慢管理语句
SET GLOBAL log_slow_admin_statements = ON;
注意:
slow_query_log_file 是全局只读变量,不能在会话级别修改。修改后,新打开的会话才会使用新文件路径。另外,long_query_time 的修改对当前已存在的连接不生效,需要重新连接或使用 SET SESSION long_query_time = 0.2; 为当前会话设置。
2.2.2 静态配置(持久化)
将参数写入MySQL配置文件(my.cnf 或 my.ini),重启后永久生效。
[mysqld]
# 开启慢查询日志
slow_query_log = ON
# 日志文件路径
slow_query_log_file = /var/log/mysql/slow_query.log
# 慢查询阈值(秒)
long_query_time = 0.2
# 记录未使用索引的查询
log_queries_not_using_indexes = ON
# 记录慢管理语句
log_slow_admin_statements = ON
# 可选:最小检查行数
min_examined_row_limit = 100
2.3 验证配置是否生效
配置完成后,需要通过以下步骤验证日志是否正常工作。
- 检查参数状态:
SHOW VARIABLES LIKE 'slow_query_log%'; SHOW VARIABLES LIKE 'long_query_time'; - 手动生成一条慢查询:
SELECT SLEEP(1); - 查看日志文件内容:
如果配置正确,应该能看到类似如下的记录:sudo tail -f /var/log/mysql/slow_query.log# Time: 2025-03-15T10:30:00.123456Z # User@Host: root[root] @ localhost [] Id: 1234 # Query_time: 1.000234 Lock_time: 0.000000 Rows_sent: 1 Rows_examined: 0 SET timestamp=1742020200; SELECT SLEEP(1);
2.4 慢查询日志配置流程
下图展示了从配置到验证的完整流程,帮助你在压测环境中快速部署:
2.5 压测环境推荐配置清单
针对搜索服务尾延迟压测场景,以下是一份经过验证的推荐配置清单:
- 阈值设置:
long_query_time = 0.1(100毫秒),捕获所有超过100ms的查询。 - 索引检查:开启
log_queries_not_using_indexes = ON,发现潜在的全表扫描。 - 日志轮转:配置
log_slow_admin_statements = ON,记录DDL操作对压测的影响。 - 文件路径:使用独立磁盘(如SSD)存储日志文件,避免与数据文件争抢I/O。
- 日志清理:压测前清空旧日志,压测后立即归档分析。
关键指标:在压测环境中,慢查询日志的开启本身会带来约 1%-3% 的性能开销。对于高并发搜索服务,建议在压测期间开启,压测结束后关闭,避免对生产环境造成持续影响。