MySQL慢查询排查与优化指南

 更新时间:2026年04月20日 08:53:09   作者:不会写DN  
本文介绍了MySQL慢查询日志的开启与分析,首先,介绍了如何开启慢查询日志,包括临时开启和永久开启的方法,然后阐述了如何抓取慢SQL、分析SQL执行计划以及优化SQL/索引的方法,需要的朋友可以参考下

开启慢查询日志 → 抓取慢 SQL → 分析 SQL 执行计划 → 优化 SQL / 索引。

首先开发MySQL 慢查询

登录 MySQL 查看当前状态

-- 查看慢查询日志整体开关
show variables like 'slow_query_log';
-- 查看慢查询阈值(默认 10秒)
show variables like 'long_query_time';
-- 查看慢日志文件存放路径
show variables like 'slow_query_log_file';

临时开启(重启失效,适合临时排查)

-- 1. 开启慢查询日志
set global slow_query_log = ON;

-- 2. 设置阈值:执行超过 1秒 就记录
set global long_query_time = 1;

-- 3. 可选:记录没有走索引的SQL
set global log_queries_not_using_indexes = ON;

注意:global 修改后,新连接才生效,当前会话需要重连。

永久开启(my.cnf/my.ini,生产推荐)

1. 找到配置文件

  • Linux:/etc/my.cnf/etc/mysql/my.cnf
  • Windows:my.ini

2. 在 [mysqld] 模块添加

[mysqld]
# 开启慢查询日志
slow_query_log = 1
# 慢日志文件路径
slow_query_log_file = /var/log/mysql/slow.log
# 慢查询时间阈值 1s
long_query_time = 1
# 记录未使用索引的SQL
log_queries_not_using_indexes = 1
# 避免日志刷爆,限制每分钟记录条数
log_throttle_queries_not_using_indexes = 10

3. 重启 MySQL 生效

# CentOS
systemctl restart mysqld

# Ubuntu
systemctl restart mysql
  • long_query_time包含锁等待时间,不只是 SQL 执行时间
  • 慢日志会损耗少量 IO,生产不要开太大阈值,一般设 1s
  • 大流量环境不要开启 log_queries_not_using_indexes,容易日志爆炸

查看慢查询日志

直接看日志文件

# 查看最后100行慢查询
tail -n 100 /var/lib/mysql/localhost-slow.log

日志里会记录:

  • 执行时间
  • 锁等待时间
  • 扫描行数
  • 具体 SQL 语句

mysqldumpslow(MySQL 自带)

# 查看耗时最多的10条慢SQL
mysqldumpslow -s t -t 10 /var/log/mysql/slow.log
# 按访问次数排序
mysqldumpslow -s c -t 10 慢日志路径

专业工具

  • pt-query-digest(Percona 工具集,线上分析首选)
  • 配合监控:Prometheus + Grafana、阿里云 / 云数据库自带慢查询分析

分析慢 SQL

抓到慢 SQL 后,用 EXPLAIN 看执行计划,判断问题在哪。

-- `EXPLAIN` 是 MySQL 提供的**诊断命令**,
EXPLAIN SELECT * FROM orders WHERE user_id = 1001 AND create_time > '2025-01-01';

type:最重要

  • ALL:全表扫描(最差,必须优化)
  • index:索引全扫描
  • range:范围索引(正常)
  • ref / eq_ref:精准索引(优秀)

key:实际使用的索引

  • NULL = 没用到索引

rows:扫描的行数

  • 越大越慢

常见慢查询原因 & 解决方案

没有索引 / 索引失效(80% 场景): WHEREJOINORDER BY 字段没建索引

-- 给 user_id + create_time 建【联合索引】
CREATE INDEX idx_user_id_create_time ON orders(user_id, create_time);

索引失效的典型写法

-- 会导致索引失效 不能对【索引列】做任何函数运算、四则运算、隐式转换、后置模糊匹配
SELECT * FROM t WHERE YEAR(create_time) = 2025;
SELECT * FROM t WHERE id + 1 = 100;
SELECT * FROM t WHERE name LIKE '%张三';

改成:

SELECT * FROM t WHERE create_time >= '2025-01-01' AND create_time < '2026-01-01';
SELECT * FROM t WHERE id = 99;
SELECT * FROM t WHERE name LIKE '张三%';

一次性查询太多数据

SELECT * FROM big_table;  -- 无WHERE条件,全表扫描

解决:加 LIMIT、分页、分批查询。

锁等待 / 大事务: SQL 本身很快,但执行时间很长

-- 查看 InnoDB 底层实时状态
SHOW ENGINE INNODB STATUS;

看事务锁等待信息。

数据库服务器负载高: CPU/IO/内存 瓶颈

SHOW PROCESSLIST;  -- 查看正在执行的SQL

到此这篇关于MySQL慢查询排查与优化指南的文章就介绍到这了,更多相关MySQL慢查询排查与优化内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MySQL执行状态查看与分析过程

    MySQL执行状态查看与分析过程

    这篇文章主要介绍了MySQL执行状态查看与分析过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-07-07
  • MySQL单机多实例部署两种实用方案

    MySQL单机多实例部署两种实用方案

    本文介绍了两种MySQL多实例部署方案:手动复制实例和使用mysqld_multi工具,手动复制实例适用于实例数量较少、需要灵活配置的场景,文章详细描述了两种方案的操作步骤、关键命令和注意事项,适用于Linux环境下的MySQL运维,感兴趣的朋友跟随小编一起看看吧
    2026-01-01
  • pymysql操作mysql数据库的方法

    pymysql操作mysql数据库的方法

    这篇文章主要介绍了pymysql简单操作mysql数据库的方法,主要讲的是一些基础的pymysql操作mysql数据库的方法,结合实例代码给大家讲解的非常详细,需要的朋友可以参考下
    2023-04-04
  • MySql与Navicat安装教程分享

    MySql与Navicat安装教程分享

    这篇文章主要介绍了MySql与Navicat安装教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • MySQL常见故障与优化方式

    MySQL常见故障与优化方式

    这篇文章主要介绍了MySQL常见故障与优化方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教<BR>
    2024-04-04
  • Mysql简易索引方案讲解

    Mysql简易索引方案讲解

    这篇文章主要为大家介绍了Mysql索引如何实现更加简易的查找方案,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • 优化MySQL数据库中的查询语句详解

    优化MySQL数据库中的查询语句详解

    这篇文章主要介绍了优化MySQL数据库中的查询语句,非常实用的经验总结,需要的朋友可以参考下
    2014-07-07
  • Windows免安装MySQL 8.0.28 版本图文教程

    Windows免安装MySQL 8.0.28 版本图文教程

    这篇文章主要为大家详细介绍了Windows免安装MySQL8.0.28版本图文教程,文中安装步骤介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • MySQL中on duplicate key update的使用方法实例

    MySQL中on duplicate key update的使用方法实例

    在做数据统计的时候,我们经常会用到mysql的on duplicate key update语法来自动更新数据,下面这篇文章主要给大家介绍了关于MySQL中on duplicate key update的使用方法的相关资料,需要的朋友可以参考下
    2022-09-09
  • mysql socket文件作用详解

    mysql socket文件作用详解

    这篇文章主要介绍了mysql socket文件作用的相关资料,需要的朋友可以参考下
    2016-09-09

最新评论