慢查询日志与通用日志是什么
慢查询日志记录执行时间超过 long_query_time 的语句,是性能分析和慢 SQL 治理的必备开关;通用日志记录每一条到达服务端的语句(含明文 SQL),写放大明显,只适合短时排障。两者都由 log_output 决定写文件还是写 mysql 库的表,动态开启无需重启。
基本信息
| 慢日志开关 | slow_query_log 与 long_query_time |
|---|---|
| 通用日志开关 | general_log,开销大,用完即关 |
| 输出方式 | log_output 为 FILE 或 TABLE |
| 记录补充 | log_queries_not_using_indexes 会记录未走索引的语句 |
| 分析工具 | pt-query-digest、mysqldumpslow 聚合统计 |
典型使用场景
- 定位慢 SQL:按耗时排序找出需要优化的语句
- 上线审核:新功能上线后观察是否引入新的慢查询
- 锁与临时表分析:结合慢日志中的统计字段定位原因
- 复现线上语句:短时开启通用日志抓取完整请求序列
- 定期汇总:按周聚合慢日志,跟踪 Top 语句变化
- 诊断连接问题:通用日志能确认语句是否真的到达服务端
动态开启与配置文件
动态开启与配置文件
SET GLOBAL slow_query_log = ON;
SET GLOBAL long_query_time = 1; -- 超过 1 秒即记录
SET GLOBAL log_output = 'TABLE'; -- 输出到 mysql.slow_log
SELECT start_time, query_time, sql_text FROM mysql.slow_log ORDER BY start_time DESC LIMIT 10;
-- 排障用通用日志(用完立刻关闭)
SET GLOBAL general_log = ON;
SET GLOBAL general_log = OFF;
-- 配置文件方式(输出到文件)
-- [mysqld]\n-- slow_query_log = 1\n-- slow_query_log_file = /var/log/mysql/slow.log\n-- long_query_time = 1\n-- log_queries_not_using_indexes = 0\n-- log_output = FILE两类日志对照
| 维度 | 慢查询日志 | 通用日志 |
|---|---|---|
| 记录范围 | 超过阈值的语句 | 每一条到达服务端的语句 |
| 开销 | 较低,可按阈值控制 | 很高,写放大明显 |
| 适用时长 | 可长期开启 | 仅短时排障 |
| 输出方式 | FILE 或 TABLE | FILE 或 TABLE |
| 主要用途 | 性能分析与治理 | 确认请求是否到达与顺序 |
general log 含明文 SQL 与敏感数据且写放大明显;log_queries_not_using_indexes 在小表查询多的实例上也会刷爆日志。
解析慢日志会消耗额外 IO 与 CPU,线上长期把 long_query_time 设得过低(例如 0.01 秒)会让日志文件快速膨胀并挤占磁盘;建议先用 0.1 到 1 秒观察,再结合聚合工具收敛。
把慢日志接入采集体系比人工翻文件更有效:定期解析后沉淀成 Top 语句清单,并持续跟踪它们的耗时变化,治理才算形成闭环。