MySQL 慢查询日志
🧠 一、慢查询日志是干什么的?
MySQL 的 慢查询日志(Slow Query Log)是诊断 SQL 性能瓶颈的重要工具。
📌 它会记录所有 执行时间超过 long_query_time 阈值 的 SQL 查询语句(不包括数据复制、EXPLAIN、SHOW 等元数据操作)。
⚙️ 二、慢查询日志的核心配置项解释
| 变量 | 含义 | 示例 |
|---|---|---|
slow_query_log |
是否开启慢查询日志 | ON / OFF |
slow_query_log_file |
日志文件的存储路径 | /var/lib/mysql/mysql-slow.log |
long_query_time |
判断“慢查询”的时间阈值(秒) | 1、0.1 等 |
log_output |
日志记录输出方式(表/文件) | FILE、TABLE、FILE,TABLE |
log_queries_not_using_indexes |
是否记录未使用索引的查询 | ON / OFF(默认 OFF) |
你可用如下命令检查这些配置:
SHOW VARIABLES LIKE '%slow_query_log%';
SHOW VARIABLES LIKE '%long_query_time%';
SHOW VARIABLES LIKE '%log_output%';
🧪 三、运行流程与实验说明
以下是你执行的操作流程的详解。
✅ 第一步:确认慢查询是否开启
SHOW VARIABLES LIKE '%slow_query_log%';
-
确认当前慢查询功能是否开启。
-
如果结果是
OFF,则必须显式开启:
SET GLOBAL slow_query_log = ON;
✅ 第二步:设置慢查询判断的阈值
SET GLOBAL long_query_time = 1;
-
表示执行时间超过 1 秒的查询就会被记录为慢查询。
-
最小精度是微秒级(例如
0.01表示 10ms)
⚠️ 注意:long_query_time 是浮点数。
✅ 第三步:指定日志输出形式
SET GLOBAL log_output = 'TABLE';
-
可选值有:
-
'FILE':日志输出到文件,配合slow_query_log_file -
'TABLE':输出到mysql.slow_log表 -
'FILE,TABLE':同时输出到文件和表
-
✅ 第四步:执行慢 SQL 模拟
SELECT SLEEP(5);
-
该语句会“睡眠”5秒,模拟耗时 SQL。
-
只要慢查询阈值设置在
5秒以内(如你设置了1),这个 SQL 就会被记录。
✅ 第五步:查看慢查询记录
如果是表输出
SELECT * FROM mysql.slow_log\G
- 会返回诸如以下字段:
| 字段 | 说明 |
|---|---|
| start_time | 查询开始时间 |
| user_host | 用户名和客户端信息 |
| query_time | 执行耗时 |
| lock_time | 锁等待时间 |
| rows_sent | 返回结果行数 |
| rows_examined | 扫描行数 |
| db | 查询使用的数据库 |
| sql_text | 实际执行的 SQL |
| last_insert_id / insert_id | 插入 ID 信息 |
📄 四、慢日志文件格式(FILE 模式)
如果你设置了 log_output = FILE,日志会记录在 slow_query_log_file 指定的文件中,内容格式类似:
# Time: 2025-04-30T10:05:41.123456Z
# User@Host: root[root] @ localhost []
# Query_time: 5.001214 Lock_time: 0.000112 Rows_sent: 0 Rows_examined: 0
SET timestamp=1682930741;
SELECT SLEEP(5);
🛠️ 五、配置持久化方式(防止重启失效)
在 my.cnf(或 my.ini)文件中增加配置:
[mysqld]
slow_query_log = 1
slow_query_log_file = /var/lib/mysql/mysql-slow.log
long_query_time = 1
log_output = TABLE
然后重启 MySQL:
sudo systemctl restart mysqld
📊 六、慢日志的应用价值
| 应用场景 | 描述 |
|---|---|
| 查询调优 | 识别慢 SQL,使用 EXPLAIN 优化索引 |
| 问题诊断 | 高频慢查询可能是故障诱因 |
| 自动分析 | 可用 pt-query-digest 工具做聚合分析 |
| 日常监控 | 联动监控告警系统,实时触发慢查询告警 |
🧩 七、慢查询日志分析建议工具
1. 使用 pt-query-digest
pt-query-digest /var/lib/mysql/mysql-slow.log > analysis.txt
-
按查询模板聚合
-
显示执行次数、平均耗时、总耗时、95分位、标准差等
🧷 八、注意事项与最佳实践
| 项 | 建议 |
|---|---|
| 性能影响 | log_output=TABLE 会略增加 I/O 负载,建议仅在开发或分析阶段开启 |
| 时间精度 | long_query_time=0 表示记录所有 SQL,慎用 |
| 大表频率 | 避免使用 SELECT * FROM big_table,容易变成慢 SQL |
| SQL 优化 | 慢日志只是入口,根本优化需要 EXPLAIN + 索引 + SQL 重写 |
License:
CC BY 4.0