MySQL慢查询日志分析方法
慢查询是什么?
- 慢查询就是执行耗时的SQL,然后记录到日志文件里,方便进行分析
- MySQL 慢查询日志(Slow Query Log)是优化数据库性能的重要工具,它记录执行时间超过指定阈值或未使用索引的 SQL 语句。以下是分析慢查询日志的完整流程:
- 文章已经整理成PDF电子书,喜欢的朋友可以转存以下,方便查看:
https://pan.quark.cn/s/f52968c518d3
1. 启用慢查询日志
配置参数(在 my.cnf
或 my.ini
中):
[mysqld]
slow_query_log = 1 # 启用慢查询日志
slow_query_log_file = /path/to/slow.log # 日志文件路径
long_query_time = 2 # 记录执行时间超过2秒的查询(单位:秒)
log_queries_not_using_indexes = 1 # 记录未使用索引的查询
重启 MySQL 服务使配置生效。
2. 查看慢查询日志
方式 1:直接查看日志文件
tail -f /path/to/slow.log
方式 2:使用内置工具 mysqldumpslow
# 按总执行时间排序
mysqldumpslow -s t /path/to/slow.log# 按出现次数排序
mysqldumpslow -s c /path/to/slow.log# 按锁定时间排序
mysqldumpslow -s l /path/to/slow.log
方式 3:使用 Percona Toolkit(推荐)
pt-query-digest /path/to/slow.log > analysis.txt
生成的分析报告会汇总高耗时 SQL、执行频率、索引使用情况等。
3. 分析关键指标
(1) 高执行时间 SQL
• 检查 Query_time
字段,定位耗时最长的查询。
• 关注 Lock_time
(锁等待时间)是否过高。
(2) 高频查询
• 统计重复出现的 SQL,高频慢查询对系统影响更大。
(3) 索引缺失
• 检查是否 Rows_examined
远大于 Rows_sent
,可能缺少索引。
• 用 EXPLAIN
分析执行计划:
EXPLAIN SELECT ...;
• 若 type=ALL
表示全表扫描。
• 若 key=NULL
表示未使用索引。
(4) 其他问题
• 临时表使用:Using temporary
。
• 文件排序:Using filesort
。
• 大结果集:检查 Rows_sent
是否过大。
4. 优化建议
(1) 添加索引
ALTER TABLE table_name ADD INDEX idx_column(column_name);
(2) 重写 SQL
• 避免 SELECT *
,只查询必要字段。
• 优化 JOIN 操作,减少嵌套子查询。
• 分页查询使用延迟关联:
SELECT * FROM table INNER JOIN (SELECT id FROM table LIMIT 1000000, 10) AS tmp USING(id);
(3) 调整配置
• 增大 innodb_buffer_pool_size
(缓存池大小)。
• 调整 tmp_table_size
和 max_heap_table_size
避免磁盘临时表。
(4) 拆分大查询
• 将复杂查询拆分为多个简单步骤,分批处理数据。
(5) 表结构优化
• 对频繁查询的大表进行分区或分库分表。
• 使用合适的数据类型(如用 INT 代替 VARCHAR 存储 ID)。
5. 工具推荐
工具 | 用途 |
---|---|
mysqldumpslow | MySQL 内置工具,快速汇总日志 |
pt-query-digest | Percona 的高级分析工具,生成详细报告 |
MySQL Workbench | 可视化分析执行计划 |
Prometheus + Grafana | 监控数据库实时性能 |
6. 注意事项
- 性能影响:开启慢查询日志会轻微增加 I/O 压力,高并发场景慎用。
- 日志轮换:定期清理或归档旧日志,避免磁盘空间耗尽。
- 综合监控:结合
SHOW PROCESSLIST
、SHOW STATUS
等命令全面分析。
通过以上步骤,您可以快速定位 MySQL 性能瓶颈并针对性优化。持续监控慢查询日志是保障数据库高效运行的关键实践。