当前位置: 首页
数据库
MySQL慢查询排查完整流程步骤详解

MySQL慢查询排查完整流程步骤详解

时间:2026-07-29
转载

确认慢查询需开启日志并设置阈值,通过EXPLAIN分析执行计划,用SHOWPROFILE定位耗时步骤。常见原因包括未走索引、索引失效、数据量过大、锁等待及SQL写法低效,对应采用加索引、改写SQL、分页优化、锁排查及重写语句。系统层面检查数据库配置与服务器资源,并建立定期巡检与监控告警机制。

在日常数据库运维中,慢查询就像一颗定时冲击波——平时不显山不露水,一旦流量上来,瞬间就能把系统拖垮。今天分享一套已经过无数次实战检验的排查方案,从发现问题到定位根因,再到优化落地,全链路覆盖,可以直接拿来用。

MySQL中慢查询排查的完整流程详解

第一步:确认慢查询是否存在

1.1 开启慢查询日志

先别急着分析,得确认慢查询到底有没有被记录。默认情况下,MySQL的慢查询日志可能是关闭的,需要手动开启。

-- 查看当前状态SHOW VARIABLES LIKE 'slow_query%';SHOW VARIABLES LIKE 'long_query_time';-- 临时开启(重启失效)SET GLOBAL slow_query_log = ON;SET GLOBAL long_query_time = 1;  -- 超过1秒记录SET GLOBAL log_queries_not_using_indexes = ON;

这里有个小建议:生产环境里long_query_time设成1秒通常够用,如果业务对延迟极其敏感,可以调到0.5秒甚至更低。不过要注意,记录太细可能会产生大量日志,影响磁盘IO。

1.2 查看慢查询数量与内容

开启之后,怎么知道有没有慢查询?两个命令搞定:

# 统计慢查询次数SHOW GLOBAL STATUS LIKE '%Slow_queries%';# 查看最近慢查询日志文件路径SHOW VARIABLES LIKE 'slow_query_log_file';

数值如果一直往上飙,说明系统确实存在性能瓶颈,该进入下一步了。

第二步:分析慢查询语句

2.1 使用 EXPLAIN 分析执行计划

拿到慢查询SQL后,第一件事就是用EXPLAIN看执行计划。这就像去医院做CT,能直接看到MySQL是怎么执行这条语句的。

EXPLAIN SELECT * FROM orders WHERE status = 1 ORDER BY created_at DESC LIMIT 100;

重点关注这几个字段,一旦出现危险信号,基本就是问题所在:

字段危险信号
typeALL(全表扫描)、index(索引全扫)
rows远大于预期返回行数
ExtraUsing filesort(文件排序)、Using temporary(临时表)

2.2 使用 SHOW PROFILE 查看耗时分布

EXPLAIN能告诉你“怎么执行”,但想知道“时间花在哪里”,还得靠SHOW PROFILE。这个工具可以精确到每个步骤的耗时。

-- 开启 profilingSET profiling = 1;-- 执行你的慢查询SELECT * FROM orders WHERE ...;-- 查看所有查询的耗时SHOW PROFILES;-- 查看具体某个 Query_ID 的详细耗时SHOW PROFILE FOR QUERY 1;

重点看这几个步骤的耗时占比:Sending data、Sorting result、Creating tmp table。如果某个步骤时间异常高,比如Sending data占了90%,那说明数据量大或索引没用好;Sorting result高则意味着排序操作消耗大,可能需要优化排序字段的索引。

第三步:常见原因与对应解决方案

3.1 没走索引 → 加索引

这是最经典的问题。先检查表上已有的索引:

-- 检查是否有可用索引SHOW INDEX FROM orders;

如果发现查询条件字段没有索引,或者索引不合适,那就加一个复合索引。注意字段顺序:等值条件字段放前面,范围条件字段放后面。

-- 添加复合索引(注意字段顺序:等值条件在前,范围条件在后)ALTER TABLE orders ADD INDEX idx_status_created (status, created_at);

3.2 索引失效 → 改写 SQL

有时候明明有索引,但查询还是慢,那很可能是索引失效了。常见的“坑”有这几个:

  • 对索引列使用函数:WHERE DATE(created_at) = '2024-01-01' — 改成范围查询WHERE created_at >= '2024-01-01' AND created_at < '2024-01-02'
  • 隐式类型转换:WHERE user_id = '123'(user_id 是 int) — 类型要匹配,去掉引号
  • 前导模糊匹配:WHERE name LIKE '%张三' — 这种只能用全文索引或改业务逻辑

3.3 数据量过大 → 分页优化 / 归档

深分页是另一种常见痛点。比如翻到第10000页,MySQL需要先扫描大量行,再丢弃掉前面的,非常低效。

深分页优化示例:

-- 原始写法(越往后越慢)SELECT * FROM orders ORDER BY id LIMIT 100000, 20;-- 优化写法(子查询用覆盖索引)SELECT * FROM orders WHERE id > (SELECT id FROM orders ORDER BY id LIMIT 100000, 1)ORDER BY id LIMIT 20;

如果数据量实在太大,还可以考虑数据归档:把历史数据迁移到归档表或分区表,这样主表的行数降下来,查询自然就快了。

3.4 锁等待 → 排查锁冲突

有时候慢不是因为SQL本身慢,而是被其他事务堵住了。这种情况在高并发写操作时尤其常见。

-- 查看当前正在等待锁的事务SELECT * FROM information_schema.INNODB_TRXG-- 查看锁等待关系SELECT * FROM sys.schema_table_lock_waits;-- 强制结束阻塞事务(慎用)KILL [trx_mysql_thread_id];

注意:KILL操作要谨慎,确保不会造成数据不一致。更推荐从业务层面优化事务逻辑,减少锁持有时间。

3.5 SQL 写得烂 → 重写

有些慢查询纯粹是SQL写法太“奔放”。典型坏写法包括:

  • SELECT * → 只取需要的列,减少数据传输
  • 子查询嵌套过深 → 改用 JOIN 或临时表
  • OR 条件 → 拆成 UNION ALL,能利用索引
  • 循环查询 → 批量查询 + IN,避免N+1问题

第四步:系统层面排查

4.1 查看数据库配置是否合理

有时候SQL本身没问题,但数据库配置没跟上,也会导致慢。重点关注这几个参数:

-- 关键参数检查SHOW VARIABLES LIKE 'innodb_buffer_pool_size';    -- 建议设为内存的60%-70%SHOW VARIABLES LIKE 'tmp_table_size';              -- 临时表大小限制SHOW VARIABLES LIKE 'max_connections';             -- 连接数是否过高

其中innodb_buffer_pool_size是最关键的,如果设置太小,MySQL会频繁进行磁盘IO,性能直线下降。一般建议设为物理内存的60%~70%,如果服务器是专用数据库,可以更高。

4.2 查看服务器资源

数据库的根因也可能是服务器资源本身不够。用系统命令看看:

# CPU、内存、IO 情况topiostat -x 1free -h

如果 CPU 高但 IO 低 → SQL 计算量大或索引不合理,需要优化SQL或增加索引。

如果 IO 高但 CPU 低 → 磁盘瓶颈,考虑换 SSD 或增加 buffer pool 大小。

第五步:建立长效机制

5.1 定期巡检脚本

优化不是一次性的,需要持续监控。可以定期跑这两个查询,防患于未然:

-- 查询当前运行时间最长的SQLSELECT * FROM information_schema.PROCESSLIST WHERE COMMAND != 'Sleep'ORDER BY TIME DESC LIMIT 10;-- 查询全表扫描次数最多的表SELECT * FROM sys.schema_unused_indexes;

5.2 监控告警

有了日志和巡检,还得有告警机制。建议这样做:

  • 设置 long_query_time = 1,持续采集慢查询日志
  • 使用 Percona Toolkit 的 pt-query-digest 分析日志规律,找出高频慢SQL
  • 接入 Prometheus + Grafana 监控 QPS、慢查询数量趋势,一旦异常立刻告警

一句话总结排查思路

先确认慢在哪(日志+profile),再看为什么慢(explain+索引),最后对症下药(加索引/改SQL/扩资源)。 这套流程走下来,90%的慢查询问题都能解决。剩下的10%,可能就是业务架构层面的问题了,比如分库分表、缓存、读写分离等,那又是另一个话题了。

游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

同类文章
更多
Redis是什么:核心特性、架构与应用场景解析

Redis是什么:核心特性、架构与应用场景解析

Redis是一款基于内存的键值型NoSQL数据库,以超高读写速度和丰富的数据结构著称。本文系统梳理Redis的核心特性、架构组成、性能优势及典型应用场景,并通过与Memcached、MySQL、MongoDB的对比,帮助开发者快速判断Redis是否适合当前业务需求。

时间:2026-09-01 06:20
Windows 安装 MongoDB 完整图文教程

Windows 安装 MongoDB 完整图文教程

本文详细介绍在 Windows 系统上安装 MongoDB 的完整流程。从官网下载 MSI 安装包开始,逐步演示自定义安装路径、配置 Windows 服务、跳过 MongoDB Compass 等关键选项,并提供通过系统服务列表验证安装是否成功的方法,帮助开发者快速搭建本地 MongoDB 环境。

时间:2026-09-01 06:20
Linux 安装 MongoDB 完整指南:依赖配置、环境变量与服务启动

Linux 安装 MongoDB 完整指南:依赖配置、环境变量与服务启动

本文详解在 Linux 系统下安装 MongoDB 的完整流程,涵盖依赖包安装、二进制包下载解压、环境变量配置、数据与日志目录创建及服务启动验证。通过标准化命令与路径说明,帮助开发者快速完成部署并确认服务状态。

时间:2026-09-01 06:20
MacOS安装MongoDB完整教程

MacOS安装MongoDB完整教程

本文介绍在MacOS系统下安装MongoDB的完整流程,涵盖下载、解压、目录配置、环境变量设置及服务启动。通过明确的命令与参数说明,帮助开发者快速完成环境搭建并验证安装结果。

时间:2026-09-01 06:19
Ubuntu系统安装与配置Redis完整指南

Ubuntu系统安装与配置Redis完整指南

本文详解在Ubuntu系统中安装Redis的两种主流方式:apt在线安装与源码编译安装。涵盖版本选择逻辑、服务启停与状态检查、连接验证方法,以及在线练习工具与桌面GUI客户端的对比与使用建议,帮助开发者快速搭建并验证Redis运行环境。

时间:2026-09-01 06:19
热门专题
更多
刀塔传奇破解版无限钻石下载大全 刀塔传奇破解版无限钻石下载大全
洛克王国正式正版手游下载安装大全 洛克王国正式正版手游下载安装大全
思美人手游下载专区 思美人手游下载专区
好玩的阿拉德之怒游戏下载合集 好玩的阿拉德之怒游戏下载合集
不思议迷宫手游下载合集 不思议迷宫手游下载合集
百宝袋汉化组游戏最新合集 百宝袋汉化组游戏最新合集
jsk游戏合集30款游戏大全 jsk游戏合集30款游戏大全
宾果消消消原版下载大全 宾果消消消原版下载大全