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 慢查询,避免全量扫描。