本文深入讲解MySQL慢查询日志的配置、分析方法及优化实战,包含日志参数详解、SQL性能诊断工具使用,以及通过真实案例演示如何定位和解决慢查询问题,帮助开发者提升数据库性能。
一、什么是慢查询日志?
MySQL慢查询日志是数据库记录执行时间超过指定阈值的SQL语句的专用日志,它是性能优化的核心工具之一。通过分析慢查询日志,可以快速定位需要优化的SQL语句。
二、配置慢查询日志
在my.cnf配置文件中添加以下参数(需重启服务生效):
启用慢查询日志
slow_query_log = 1
指定日志文件路径
slow_query_log_file = /var/log/mysql/mysql-slow.log
定义慢查询阈值(单位:秒)
long_query_time = 1
记录未使用索引的查询
log_queries_not_using_indexes = 1
记录管理语句
log_slow_admin_statements = 1
三、动态设置参数(无需重启)
通过MySQL客户端实时修改配置:
-- 临时开启慢查询日志
SET GLOBAL slow_query_log = 'ON';
-- 设置慢查询阈值
SET GLOBAL long_query_time = 0.5;
-- 查看当前设置
SHOW VARIABLES LIKE 'slow_query%';
SHOW VARIABLES LIKE 'long_query_time';
四、日志分析工具实战
1. mysqldumpslow工具
MySQL自带的日志分析工具:
查看执行时间最长的10条SQL
mysqldumpslow -s t -t 10 /var/log/mysql/mysql-slow.log
统计出现次数最多的SQL
mysqldumpslow -s c -t 5 /var/log/mysql/mysql-slow.log
2. pt-query-digest工具
Percona Toolkit中的专业分析工具:
生成分析报告
pt-query-digest /var/log/mysql/mysql-slow.log > slow_report.txt
分析特定时间段的日志
pt-query-digest --since '2023-06-01 00:00:00'
--until '2023-06-02 00:00:00'
/var/log/mysql/mysql-slow.log
五、典型慢查询案例分析
案例1:未使用索引查询
日志片段:
Query_time: 3.245408 Lock_time: 0.000123 Rows_sent: 1 Rows_examined: 500000
SELECT FROM users WHERE phone = '13800138000';
解决方案: 为phone字段添加索引:ALTER TABLE users ADD INDEX idx_phone(phone);
案例2:复杂联表查询
Query_time: 8.127451 Lock_time: 0.002345
SELECT FROM orders o
JOIN users u ON o.user_id = u.id
WHERE o.create_time > '2023-01-01'
ORDER BY o.amount DESC
LIMIT 1000;
优化方案:
- 确保user_id和create_time字段有索引
- 考虑使用覆盖索引
- 分批查询替代大结果集
六、慢查询优化黄金法则
- EXPLAIN分析每个慢查询的执行计划
- 优先优化扫描行数(Rows_examined)最多的查询
- 关注Lock_time过长的查询(可能存在锁竞争)
- 定期归档历史数据减少表体积
- 避免使用SELECT ,只查询必要字段
通过系统化的慢查询日志分析,可以显著提升MySQL数据库性能。建议每周至少分析一次慢查询日志,将数据库优化纳入常规运维流程。
评论