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 验证配置是否生效

配置完成后,需要通过以下步骤验证日志是否正常工作。

  1. 检查参数状态:
    SHOW VARIABLES LIKE 'slow_query_log%';
    SHOW VARIABLES LIKE 'long_query_time';
  2. 手动生成一条慢查询:
    SELECT SLEEP(1);
  3. 查看日志文件内容:
    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 慢查询日志配置流程

下图展示了从配置到验证的完整流程,帮助你在压测环境中快速部署:

慢查询日志配置与验证流程 1. 配置参数 2. 开启日志 3. 设置阈值 4. 验证状态 5. 生成慢查询 6. 检查日志 日志是否正常? ✅ 配置完成 🔄 调整参数 说明:动态配置适用于压测环境快速验证;静态配置适用于生产环境持久化。

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% 的性能开销。对于高并发搜索服务,建议在压测期间开启,压测结束后关闭,避免对生产环境造成持续影响。