什么是慢查询日志?如何开启和分析?
一、慢查询日志:数据库的“黑匣子”和“计时器”
慢查询日志是什么?
想象一下,你的数据库是一个繁忙的超级工厂。每天都有无数的 SQL 订单涌入,要求查询、插入、更新数据。
慢查询日志就像是工厂里的一台高精度计时器和行为记录仪。
它的核心作用是:记录所有执行时间超过预设阈值的 SQL 语句。
这个“预设阈值”就是 MySQL 的一个核心参数:long_query_time。
-
• 默认值: 通常是 10 秒(是的,10秒!这在互联网应用中简直是天荒地老)。 -
• 推荐值: 业界通常建议设置为 1 秒,甚至 0.5 秒。
🌟 核心价值: 一旦开启,那些耗时超过 秒的 SQL 语句,连同它们完整的执行信息,都会被无情地记录下来,供你秋后算账!
二、实战演练:如何开启这个“监工模式”?
慢查询日志默认是关闭的(因为它也会消耗一点性能)。我们要做的第一件事,就是去配置文件里把它“请”出来!
1. 临时开启(会话级别,重启失效)
如果你只是想临时测试一下,可以登录 MySQL 客户端执行以下命令:
-- 1. 查看当前慢查询状态
SHOW VARIABLES LIKE 'slow_query%';
-- 2. 设置慢查询时间阈值(这里设为1秒)
SET GLOBAL long_query_time = 1;
-- 3. 开启慢查询日志
SET GLOBAL slow_query_log = 'ON';
-- 4. 查看慢查询日志文件位置(通常在data目录下)
SHOW VARIABLES LIKE 'slow_query_log_file';
2. 永久开启(推荐!配置文件级别)
要让它在 MySQL 重启后依然生效,你需要编辑 MySQL 的配置文件(通常是 /etc/my.cnf 或 /etc/mysql/mysql.conf.d/mysqld.cnf)。
在 [mysqld] 配置段下,添加或修改以下三行:
[mysqld]
# 开启慢查询日志,设为 1 或 ON
slow_query_log = 1
# 设置阈值,超过 1 秒的查询将被记录
long_query_time = 1
# 指定慢查询日志文件的存储路径
slow_query_log_file = /var/log/mysql/mysql-slow.log
⚠️ 记住: 修改配置文件后,一定要重启 MySQL 服务才能生效!
# 重启服务 (Linux)
sudo systemctl restart mysqld
三、庖丁解牛:如何高效分析日志?
现在日志文件已经在哗啦啦地记录那些“慢 SQL”了,但你不能直接去读一个几百兆甚至几 GB 的纯文本日志文件,那会让你眼花缭乱。
我们需要一个趁手的工具!
🔍 神器推荐:mysqldumpslow
MySQL 官方就自带了一个强大的分析工具:mysqldumpslow。它可以对日志文件进行分组、排序、统计,把海量的日志浓缩成一份精华报告。
使用示例:
# 常用命令:查看排名前10的慢查询,并按查询时间排序
mysqldumpslow -s t -t 10 /var/log/mysql/mysql-slow.log
|
|
|
|---|---|
-s |
排序方式。
t (Time,按查询时间)、c (Count,按查询次数)、r (Rows,按返回行数)
|
-t |
Top N。
t 10 就是前 10 条)
|
📈 报告解读:定位“问题儿童”
mysqldumpslow 输出的报告是模板化的,它会把所有结构相同的 SQL 归为一类(用 N 代替具体的参数),然后给出关键统计数据:
|
|
|
优化重点 |
|---|---|---|
| Count |
|
次数越多,优化收益越大! |
| Time |
|
|
| Lock |
|
|
| Rows |
|
|
🛠️ 终极优化:EXPLAIN大法
当你通过慢查询日志锁定了某条特定的“问题 SQL”后,下一步就是使用 EXPLAIN 关键字来分析它的执行计划:
EXPLAIN SELECT * FROM user WHERE name = '张三';
重点关注 EXPLAIN 结果中的几个指标:
-
1. type: 表示查询类型,是性能的关键指标。ALL(全表扫描) 是最大的警报!理想值是const、eq_ref、ref、range。 -
2. key: 实际使用的索引。如果为NULL,说明根本没用索引! -
3. rows: MySQL 估计需要检查的行数。这个数字越小越好。
结语:性能优化,从日志开始!
慢查询日志是数据库性能调优的起点。它不是万能药,但却是帮你找到病灶的最有效诊断工具。
从现在开始,开启你的数据库“监工模式”,用数据驱动优化,彻底干掉那些让你系统卡顿的“慢 SQL”吧!

