2. 慢查询基础概念:什么是慢查询、慢查询日志配置、慢查询阈值设置原则

在数据库与缓存系统中,慢查询是指执行时间超过预设阈值的查询操作。对于报表导出场景,慢查询是导致页面超时、CPU 飙升、连接池耗尽的核心诱因。理解慢查询的定义、日志配置与阈值原则,是调优的第一步。

2.1 什么是慢查询

慢查询并非仅指“执行很慢的 SQL”,而是指实际执行耗时 ≥ 系统设定的阈值的查询。在 MySQL 中,该阈值由 long_query_time 控制;在 Redis 中,由 slowlog-log-slower-than 控制。慢查询日志会记录这些查询的完整信息,供后续分析。

系统 慢查询定义 默认阈值 记录内容
MySQL 执行时间 > long_query_time 秒 10 秒 SQL 文本、执行时间、锁等待、扫描行数
Redis 执行时间 > slowlog-log-slower-than 微秒 10000 微秒 (10ms) 命令、耗时、客户端地址、时间戳
关键认知: 慢查询日志是“事后分析”工具,不是“实时告警”。它帮助你在问题发生后定位根因,而非阻止问题发生。

2.2 慢查询日志配置

以下分别展示 MySQL 和 Redis 的慢查询日志配置方式。

2.2.1 MySQL 慢查询日志配置

MySQL 的慢查询日志通过系统变量控制,支持动态修改与持久化配置。

-- 查看当前慢查询配置
SHOW VARIABLES LIKE 'slow_query%';
SHOW VARIABLES LIKE 'long_query_time';

-- 开启慢查询日志(动态生效)
SET GLOBAL slow_query_log = ON;

-- 设置日志文件路径
SET GLOBAL slow_query_log_file = '/var/log/mysql/mysql-slow.log';

-- 设置阈值:超过 2 秒即记录
SET GLOBAL long_query_time = 2;

-- 记录未使用索引的查询(辅助发现隐式慢查询)
SET GLOBAL log_queries_not_using_indexes = ON;

-- 持久化到配置文件(my.cnf)
[mysqld]
slow_query_log = 1
slow_query_log_file = /var/log/mysql/mysql-slow.log
long_query_time = 2
log_queries_not_using_indexes = 1

2.2.2 Redis 慢查询日志配置

Redis 的慢查询日志通过 SLOWLOG 命令操作,配置项在 redis.conf 中。

# redis.conf 配置
slowlog-log-slower-than 10000    # 单位微秒,10000 = 10ms
slowlog-max-len 128              # 最多保留 128 条慢日志

# 运行时查看慢日志
SLOWLOG GET 10                   # 获取最近 10 条慢日志
SLOWLOG LEN                      # 查看当前慢日志数量
SLOWLOG RESET                    # 清空慢日志
注意: Redis 慢查询日志存储在内存中,重启后丢失。生产环境建议配合监控系统(如 Prometheus + redis_exporter)持久化慢日志指标。

2.3 慢查询阈值设置原则

阈值设置并非越小越好,也不是越大越省事。需要根据业务场景、系统负载、硬件能力综合权衡。以下为通用原则:

  • 业务容忍度优先: 报表导出场景下,用户可接受 3~5 秒的等待,阈值可设为 2 秒;实时接口场景下,阈值应设为 200ms 以内。
  • 避免日志洪流: 阈值过小(如 1ms)会导致日志量暴增,消耗磁盘 IO 与 CPU,反而拖慢正常查询。
  • 分环境差异化: 开发环境可设较低阈值(如 500ms)以暴露潜在问题;生产环境建议从业务 P99 延迟倒推阈值。
  • 动态调整: 先设置一个较宽松的阈值(如 MySQL 5 秒、Redis 20ms),观察一周后根据日志量逐步收紧。
场景 推荐 MySQL 阈值 推荐 Redis 阈值 理由
报表导出(批量查询) 2~5 秒 10~50ms 用户等待时间长,避免误报
实时 API(高并发) 200ms~1 秒 1~5ms 快速发现性能劣化
离线分析(ETL) 10~30 秒 100ms~1s 允许较长时间的数据处理
开发/测试环境 500ms~1 秒 1~10ms 尽早暴露潜在慢查询
实践建议: 在报表导出模块上线前,先开启慢查询日志并设置阈值为业务容忍时间的 50%(如用户可等 5 秒,则阈值设为 2.5 秒),运行 48 小时后分析 TOP 10 慢查询,再针对性优化。

2.4 慢查询生命周期流程

下图展示了从查询发起、阈值判断、日志记录到分析优化的完整链路。

慢查询生命周期流程图 客户端发起查询 数据库执行查询 耗时 > 阈值? 记录慢查询日志 正常返回结果 分析 & 优化 阈值决定日志量级

2.5 慢查询日志分析工具

原始慢查询日志可读性差,推荐使用以下工具辅助分析:

  • mysqldumpslow: MySQL 自带工具,按平均耗时、扫描行数排序,快速定位 TOP N 慢查询。
  • pt-query-digest: Percona Toolkit 核心工具,生成 HTML 报告,支持按指纹聚合、时间范围过滤。
  • Redis SLOWLOG 命令: 直接查看最近慢命令,配合 MONITOR 命令(慎用)可做深度分析。
  • Grafana + Prometheus: 通过 mysql_slow_queries_total 等指标,可视化慢查询趋势。
效率技巧: 在报表导出高峰期,使用 pt-query-digest --since="1 hour ago" /var/log/mysql/mysql-slow.log 快速定位最近一小时的 TOP 慢查询,避免全量扫描。