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