首先开启并配置慢查询日志,设置阈值和日志路径,启用log_queries_not_using_indexes;再使用mysqldumpslow或pt-query-digest分析日志,找出执行时间长或频率高的SQL;最后通过添加索引、优化查询语句、调整表结构等手段进行针对性优化,持续监控以保障数据库性能。

在 MySQL 中,慢查询日志是诊断性能问题的重要工具。通过分析执行时间较长的 SQL 语句,可以定位数据库瓶颈并进行针对性优化。以下是开启、配置和分析慢查询日志的方法,以及常见的优化策略。
开启与配置慢查询日志
要使用慢查询日志,首先需要确保它已启用,并设置合理的阈值:
- 开启慢查询日志:在 my.cnf 或 my.ini 配置文件中添加以下参数: slow_query_log = ON
- 指定日志文件路径: slow_query_log_file = /var/log/mysql/mysql-slow.log
- 设置慢查询阈值(单位:秒),例如记录超过 1 秒的查询: long_query_time = 1
- 记录未使用索引的查询(可选但推荐): log_queries_not_using_indexes = ON
修改后重启 MySQL 或动态生效(部分参数支持 SET GLOBAL)。
使用 mysqldumpslow 分析日志
MySQL 自带的 mysqldumpslow 工具可用于解析慢查询日志,快速找出高频或耗时长的 SQL。
- 查看最慢的前 10 条查询: mysqldumpslow -s c -t 10 /var/log/mysql/mysql-slow.log
- 按执行时间排序,取前 5: mysqldumpslow -s t -t 5 /var/log/mysql/mysql-slow.log
- 筛选包含特定表的慢查询: mysqldumpslow -g “users” /var/log/mysql/mysql-slow.log
输出结果会聚合相似 SQL(忽略具体值),便于识别模式。
使用 pt-query-digest 进行深度分析
Percona Toolkit 中的 pt-query-digest 是更强大的分析工具,支持统计指标丰富、可视化建议等。
- 基本用法: pt-query-digest /var/log/mysql/mysql-slow.log
- 生成报告并保存: pt-query-digest /var/log/mysql/mysql-slow.log > slow_report.txt
- 实时监控正在运行的慢查询: pt-query-digest –processlist h=localhost
该工具提供查询执行次数、总耗时、锁等待时间、扫描行数等关键指标,帮助判断优化优先级。
常见慢查询优化策略
根据分析结果,采取以下措施提升 SQL 性能:
- 添加合适的索引:对 WHERE、ORDER BY、JOIN 字段建立复合索引,避免全表扫描。
- 避免 select *:只查询必要字段,减少数据传输和内存消耗。
- 优化 LIMIT 分页:深分页使用延迟关联或记录上次 ID,提高效率。
- 拆分复杂查询:将大 JOIN 或子查询拆为多个简单查询,利用应用层处理逻辑。
- 检查执行计划:使用 EXPLaiN 分析 SQL 执行路径,确认是否走索引、是否有临时表或文件排序。
- 调整表结构:适当冗余字段、分区大表、使用更高效的数据类型。
基本上就这些。关键是持续监控慢查询日志,结合业务场景定期优化重点 SQL,才能保障数据库稳定高效运行。