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 必须优化!

相关推荐
Database_Cool_2 小时前
OLTP 和 OLAP 区别详解:分析型数据库和事务型数据库怎么选(附阿里云 AnalyticDB MySQL 选型指南)
数据库·mysql·阿里云
爱写代码的阿森2 小时前
鸿蒙三方库 | harmony-utils之KvUtil键值型数据库操作详解
数据库·华为·harmonyos·鸿蒙·huawei
Database_Cool_2 小时前
单机 MySQL 迁移到分布式数据库方便吗?阿里云 PolarDB-X 100% MySQL 协议兼容零改造平滑迁移
数据库·分布式·mysql
姜太小白3 小时前
【MySQL】 索引优化实战:解决 WHERE 等值 + IS NULL 查询,TEXT 字段报错 1167 的完整指南
数据库·mysql
窝子面4 小时前
手搓最简前后端协作-node
javascript·数据库
吳所畏惧4 小时前
宝塔面板Redis密码修改指南:SSH命令修改 vs 面板UI界面修改,哪个更靠谱?
运维·服务器·数据库·redis·缓存·ssh
DFT计算杂谈4 小时前
无 Root 权限在 Tesla K80 零门槛部署 DeepSeek 大模型
linux·服务器·网络·数据库·机器学习
HPFBoy4 小时前
log4net 数据库存日志正确配置
数据库
liuxiaowei35 小时前
【绝版教程】新版MySQL DBA高级实战进阶班 MySQL8.0 姜承尧-腾讯数据库总监
数据库·mysql·dba