在 mysql 数据库运维中,sql 语句的执行效率直接影响系统响应速度。当网站出现卡顿、接口超时等问题时,慢查询日志(slow log) 往往是定位低效 sql 的 “第一手证据”。它能记录所有执行时间超过阈值的 sql 语句,帮助我们精准锁定性能瓶颈 —— 无论是全表扫描、索引缺失,还是 join 逻辑不合理,都能通过慢查询日志一探究竟。
一、慢查询日志基础配置
1. 查看当前慢查询状态
首先通过 mysql 命令行查看默认配置,确认慢查询日志是否启用:
-- 查看慢查询日志启用状态(on/off) show variables like 'slow_query_log'; -- 查看慢查询阈值(单位:秒,默认10秒) show variables like 'long_query_time'; -- 查看慢查询日志存储路径 show variables like 'slow_query_log_file';

2. 临时启用慢查询日志(重启失效)
适合临时排查问题,无需重启 mysql 服务:
-- 启用慢查询日志 set global slow_query_log = 'on'; -- 设置日志存储路径 set global slow_query_log_file = '/data/mysql/log/mysql-slow.log'; -- 设置阈值为 1 秒(执行时间≥1秒的sql会被记录) set global long_query_time = 1; -- 记录未使用索引的sql(可选,谨慎启用,可能产生大量日志) set global log_queries_not_using_indexes = 'on';
3. 永久启用慢查询日志(推荐)
修改 mysql 配置文件(my.cnf 或 my.ini),重启后生效:
# 1. 编辑配置文件 vim /data/mysql/conf/my.cnf # 2. 添加配置 [mysqld] # 启用慢查询日志 slow_query_log = 1 # 日志文件路径(建议放在非系统盘,避免占用系统空间) slow_query_log_file = /data/mysql/log/mysql-slow.log # 慢查询阈值(建议生产环境设为 1-3 秒) long_query_time = 1 # 记录未使用索引的sql(按需启用) log_queries_not_using_indexes = 1 # 记录管理语句(如 alter table,可选) log_slow_admin_statements = 1 # 3. 重启 mysql 服务 /etc/init.d/mysql.server restart
二、慢查询日志分析方法
1. 直接查看日志文件
慢查询日志为文本格式,可通过 cat、tail 等命令直接查看:
# 查看最新10条慢查询 tail -n 10 /data/mysql/log/mysql-slow.log # 搜索包含特定表的慢查询 grep 'user_info' /data/mysql/log/mysql-slow.log
日志格式解析(关键字段):
# time: 2026-02-04t02:37:11.367549z # 执行时间 # user@host: root[root] @ localhost [] id: 11 # 执行用户与主机 # query_time: 2.011508 lock_time: 0.000000 rows_sent: 1 rows_examined: 1 # 耗时、锁时间、返回行数、检查行数 set timestamp=1770172629; # 时间戳 select sleep(2); # 具体 sql
query_time:sql 执行时间(秒)
lock_time:锁等待时间(秒)
rows_sent:返回结果行数
rows_examined:扫描的行数(数值越大越可能存在优化空间)
2. 使用 mysqldumpslow 工具分析
mysql 自带的日志分析工具,可统计慢查询的频率、平均执行时间等:
# 统计执行次数最多的前10条慢查询 mysqldumpslow -s c -t 10 /data/mysql/log/mysql-slow.log # 统计平均执行时间最长的前10条慢查询 mysqldumpslow -s t -t 10 /data/mysql/log/mysql-slow.log # 筛选包含 join 的慢查询 mysqldumpslow -g 'join' /data/mysql/log/mysql-slow.log



参数说明:
-s:排序方式(c = 执行次数,t = 执行时间,l = 锁定时间,r = 返回行数)-t:显示条数-g:正则匹配筛选
3. 第三方工具推荐(进阶)
- pt-query-digest(percona toolkit):功能强大,支持按 sql 模板分组、统计百分比,生成详细分析报告
pt-query-digest /data/mysql/log/mysql-slow.log > slow_analysis.report
- mysql workbench:可视化工具,可通过 “performance” 模块导入慢查询日志,生成图表化分析结果
三、慢查询优化实操案例
案例 1:未使用索引导致全表扫描
慢查询日志中发现:
query_time: 4.5 rows_examined: 50000 rows_sent: 10 select * from order_info where create_time >= '2024-01-01';
优化方案:为 create_time 字段添加索引
alter table order_info add index idx_create_time (create_time);
优化后效果:query_time 降至 0.01 秒,rows_examined 变为 10。
案例 2:join 语句缺少关联索引
慢查询日志中发现:
query_time: 6.8 rows_examined: 100000 select u.name, o.order_no from user u join order o on u.id = o.user_id where o.status = 1;
优化方案:为关联字段 o.user_id 添加索引
alter table order add index idx_user_id (user_id);
案例 3:select * 导致无用字段扫描
慢查询日志中发现:
query_time: 3.1 rows_examined: 8000 select * from product where category_id = 10;
优化方案:只查询需要的字段,避免全字段扫描
select id, name, price from product where category_id = 10;
四、慢查询日志使用注意事项
控制日志大小:
- 避免将
long_query_time设置过小(如 ),否则会产生大量日志,占用磁盘空间并影响性能 - 定期轮转日志(可通过
logrotate工具或 mysql 自带的flush logs命令)
生产环境谨慎启用 “未使用索引日志”:
log_queries_not_using_indexes = 1会记录所有未使用索引的 sql,即使执行时间很短,可能导致日志膨胀- 建议仅在排查特定问题时临时启用
结合 explain 分析 sql:
对于慢查询日志中的 sql,使用 explain 查看执行计划,明确优化方向:
explain select * from user_info where age > 30;
重点关注 type(访问类型,如 all = 全表扫描、ref = 索引查找)、key(使用的索引)、rows(预计扫描行数)字段。
总结
慢查询日志是 mysql 性能优化的 “利器”,通过合理配置和高效分析,能快速定位低效 sql 并进行优化。核心步骤可概括为:
- 启用慢查询日志,设置合理阈值
- 利用工具分析日志,锁定高频 / 耗时 sql
- 通过添加索引、优化 sql 语句等方式解决瓶颈
- 持续监控日志,预防性能问题复发
掌握慢查询日志的使用,能让数据库运维从 “被动排查” 转向 “主动优化”,为系统稳定性保驾护航。
以上就是mysql使用慢查询日志slow log定位低效sql的全过程的详细内容,更多关于mysql慢查询日志定位低效sql的资料请关注代码网其它相关文章!
发表评论