MySQL 如何定位&分析慢查询?

文章目录

    • [1. 开启/检查慢日志](#1. 开启/检查慢日志)
    • [2. 分析日志](#2. 分析日志)
    • [3. 用explain分析执行计划](#3. 用explain分析执行计划)
      • [1. `type` ⭐⭐⭐(**最关键字段!**)](#1. type ⭐⭐⭐(最关键字段!))
      • [2. `rows` ⭐](#2. rows ⭐)
      • [3. `key` ⭐](#3. key ⭐)
      • [4.`Extra` ⭐⭐⭐(**隐藏陷阱!**)](#4.Extra ⭐⭐⭐(隐藏陷阱!))

1. 开启/检查慢日志

  • 看一下是否开启慢日志
sql 复制代码
SHOW VARIABLES LIKE 'slow_query_log';
SHOW VARIABLES LIKE 'long_query_time';
SHOW VARIABLES LIKE 'slow_query_log_file';
  • 如果未开启,临时开启(生产环境建议永久配置):
sql 复制代码
SET GLOBAL slow_query_log = ON; 
SET GLOBAL long_query_time = 1;

2. 分析日志

  • mysqldumpslow(MySQL 自带)

    bash 复制代码
    # 按执行次数排序前10条
      mysqldumpslow -s c -t 10 /var/log/mysql/slow.log
    
      # 按总耗时排序前10条
      mysqldumpslow -s t -t 10 /var/log/mysql/slow.log

3. 用explain分析执行计划

  • 在SQL前面加explain

    sql 复制代码
    EXPLAIN SELECT id, order_no 
    FROM orders 
    WHERE user_id = 100 AND create_time >= '2024-01-01' 
    ORDER BY create_time DESC;
    • 重点查看四个字段
字段 看什么
type 是否出现 ALL(全表扫描)
rows 扫描行数是否过大
key 是否使用到了正确索引
Extra 是否出现 Using filesortUsing temporary

1. type ⭐⭐⭐(最关键字段!

访问效率从高到低:

复制代码
system > const > eq_ref > ref > range > index > ALL
说明 是否理想
const 通过主键/唯一索引查一行 (如 WHERE id=1 ✅ 最优
eq_ref 多表连接时,使用主键或唯一索引关联 ✅ 优秀
ref 使用非唯一索引等值查询 ✅ 良好
range 索引范围扫描(如 BETWEEN, IN, > ⚠️ 可接受
index 全索引扫描(遍历整个索引树) ❌ 避免
ALL 全表扫描 ❌ 必须优化!

💡 目标:让 type 至少达到 range,最好 ref 或更高。


2. rows

  • 含义预估需要扫描的行数
  • 原则
    • 越小越好
    • 如果 type=ALLrows 很大 → 性能灾难!

3. key

  • 含义实际使用的索引
  • 关键检查
    • 是否为 NULL?→ 未走索引!
    • 是否是你期望的索引?→ 可能索引失效(如函数操作、隐式转换)

4.Extra ⭐⭐⭐(隐藏陷阱!

包含重要性能提示:

问题 优化方案
Using where 服务层过滤(正常) ---
Using index 覆盖索引(无需回表) ✅ 理想状态
Using index condition 索引条件下推(ICP,MySQL 5.6+) ✅ 优化
Using filesort 无法用索引排序,需额外排序 ORDER BY 字段加索引
Using temporary 创建临时表 (如 GROUP BY 无索引) 为分组字段加索引
Select tables optimized away 优化器直接返回结果(如 MIN/MAX ✅ 极优

💥 看到 Using filesortUsing temporary 必须优化!

相关推荐
柒.梧.1 天前
从原理到实战:Spring AOP全解析
数据库·sql
恋猫de小郭1 天前
作为 Cursor 和 Claude Code 的研发者,他们是如何看待和使用 AI
android·前端·ai编程
山峰哥1 天前
SQL优化中的索引策略与Explain分析实战
大数据·汇编·数据库·sql·编辑器
galaxyffang1 天前
Redis 的 16 个数据库应用场景
数据库·redis·缓存
喜欢猪猪1 天前
深度解析 SGLang:大模型编程新范式——从 Prompt Engineering 到 Structured Generation 的系统性跃迁
java·数据库·prompt
·云扬·1 天前
利用Orchestrator Hook实现MySQL高可用切换与VIP管理
android·数据库·mysql
坚持学习前端日记1 天前
Android JS桥技术深度解析
android·开发语言·javascript
愤怒的苹果ext1 天前
Flink CDC MySQL同步到Elasticsearch
mysql·elasticsearch·flink·cdc·同步数据
小鸡脚来咯1 天前
MySQL索引优化
sql·mysql