文章

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