news 2026/6/14 19:16:46

MySQL优化实战(二:explain参数详解)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
MySQL优化实战(二:explain参数详解)

分析一个“慢查询”的 EXPLAIN 结果

我们先写一个可能变慢的 SQL的执行计划:

EXPLAINSELECTr.nameAScity_name,st.nameAStype_name,si.nameASitem_name,s.priceAScurrent_priceFROMserve sJOINregion rONs.region_id=r.idJOINserve_item siONs.serve_item_id=si.idJOINserve_type stONsi.serve_type_id=st.idWHEREr.name='北京市'ANDsi.active_status=2ANDs.sale_status=1;

得到如下结果:


一、EXPLAIN 各列详解

id

  • 含义:查询中每个 SELECT 的唯一标识符。
  • 解读
    • id=1是主查询(最外层)
    • 如果有子查询,会是id=2id=3
  • 本例中只有一个查询,所以全是1

select_type

  • 含义:查询类型。
  • 常见值
    • SIMPLE:简单查询(无子查询、UNION)
    • PRIMARY:主查询(外层查询)
    • SUBQUERY:子查询
    • DEPENDENT SUBQUERY:依赖外部查询的子查询
  • 本例中都是SIMPLE,说明是单条查询

table

  • 含义:当前正在访问的表名。
  • 按顺序是:sisstr

partitions

  • 含义:如果表分区,显示使用的分区。
  • 当前为NULL,说明未使用分区表。

type—— 决定性能好坏

含义性能等级
ALL全表扫描❌ 最差
index全索引扫描⚠️ 差
range范围扫描(如BETWEEN,IN✅ 中等
ref使用非唯一索引查找(如=✅ 好
eq_ref使用唯一索引查找(如主键、唯一索引)✅ 很好
const常量查找(如主键等于某值)✅ 最好
分析我们的实际情况:
type说明
siALL❌ 全表扫描!这是性能瓶颈
sref✅ 通过serve_item_id查找,用了索引
steq_ref✅ 通过主键serve_type_id查找
req_ref✅ 通过主键region_id查找

possible_keys

  • 含义:数据库认为可以用于该表的索引列表。
  • 例如:sipossible_keysPRIMARY, serve_type_id
    → 说明数据库知道idserve_type_id可以用来加速查询。

但注意:只是“可能”用,不保证真的用


key

  • 含义:实际使用的索引。
  • 关键点:
    • key = NULL→ 没用任何索引(全表扫描)
    • key = PRIMARY→ 用了主键索引
    • key = serve_item_id→ 用了外键索引
分析:
key是否有效
siNULL❌ 没用索引!导致全表扫描
sserve_item_id✅ 用了外键索引
stPRIMARY✅ 用了主键
rPRIMARY✅ 用了主键

key_len

  • 含义:索引使用的字节数。

你可以通过它判断是否使用了完整索引。


ref

  • 含义:表示与索引比较的值或列。
  • 例如:
  • jzo2o-foundations.si.id→ 用si.id去匹配s.serve_item_id
  • jzo2o-foundations.si.serve_type_id→ 用si.serve_type_id去匹配st.id

它告诉你:“我用哪个字段去关联?”


rows

  • 含义:MySQL 预估需要扫描的行数。
  • 数字越小越好!
  • 例如:
    • rows = 6→ 扫描 6 条记录
    • rows = 100000→ 扫描 10万条 → 很慢!

这个数字是估算值,受统计信息影响。


filtered

  • 含义:在使用索引后,还需要过滤多少百分比的数据。
  • 范围:0~100
  • 例如:filtered = 16.67→ 索引找到的行中,只有 16.67% 符合条件

如果这个值很低(<10),说明索引没帮上忙,还是得大量过滤。


Extra

  • 含义:额外信息.
  • 常见值
    • Using where→ 查询中有 WHERE 条件,且不能完全由索引覆盖
    • Using index覆盖索引!只用索引就能返回结果,不用回表
    • Using filesort→ 需要排序,可能很慢
    • Using temporary→ 创建临时表,通常是因为 GROUP BY 或 DISTINCT
分析你的Extra
Extra说明
siUsing where在全表扫描后才过滤active_status = 2
sUsing where过滤sale_status = 1
stNULL无需额外操作
rUsing where过滤name = '北京市'

siUsing where+ALL双重打击:先全表扫,再过滤!


总结:

1.第一个表si:全表扫描(ALL)

  • 看到type: ALL,说明 MySQL 是从头到尾把si表的所有数据都扫了一遍。
  • 虽然它只查了 6 行,但“全表扫描”是个危险信号,尤其是当数据量变大时会很慢。
  • 为什么?因为虽然有PRIMARY类型id可能的索引,但最终没用上。

2.第二个表s:用了索引(ref),但效率一般

  • type: ref是个好现象,说明用了索引查找。
  • 它用了服务id区域id的组合索引,这是对的。
  • 但是filtered: 10很低,意味着虽然找到了一些行,但大部分都被后续条件过滤掉了。

3.第三个表st:很好,直接主键定位(eq_ref)

  • type: eq_ref,说明是通过主键精确匹配的,非常高效。
  • 只查了 1 行,也没问题。
  • 结论:这部分已经很完美了,不用改。

4.第四个表r:也用了主键(eq_ref),但有点小问题

  • 同样是eq_ref,靠主键查的,看起来没问题。
  • filtered: 8.33很低,说明虽然查到了 1 行,但这个行还要被WHERE条件再筛一遍,可能很多不满足。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/12 17:28:10

Android模糊效果终极指南:BlurView让你的应用瞬间提升质感

Android模糊效果终极指南&#xff1a;BlurView让你的应用瞬间提升质感 【免费下载链接】BlurView Android blur view 项目地址: https://gitcode.com/gh_mirrors/blu/BlurView 你是否曾经在开发Android应用时&#xff0c;为单调的界面设计感到困扰&#xff1f;想要实现i…

作者头像 李华
网站建设 2026/6/13 15:31:17

FreeMarker在线测试平台完全指南:模板开发与调试实战

FreeMarker在线测试平台完全指南&#xff1a;模板开发与调试实战 【免费下载链接】freemarker-online-tester Apache Freemarker Online Tester: 是一个用于在线测试 Apache Freemarker 模板的 Web 应用程序。它可以帮助开发者快速测试 Freemarker 模板的语法和功能。适合有 Fr…

作者头像 李华
网站建设 2026/6/15 14:11:08

3分钟搞定跨浏览器书签同步:BookmarkHub终极使用手册

你是否曾经因为换了电脑或浏览器&#xff0c;就再也找不到之前收藏的重要网页&#xff1f;在办公室用Chrome收藏的技术文档&#xff0c;回到家中的Edge浏览器上却无法访问&#xff1f;这种令人沮丧的经历正是BookmarkHub要彻底解决的问题。 【免费下载链接】BookmarkHub Bookma…

作者头像 李华
网站建设 2026/6/15 13:56:18

8 个降AI率工具推荐,本科生高效降AIGC指南

8 个降AI率工具推荐&#xff0c;本科生高效降AIGC指南 AI降重工具&#xff1a;高效降低AIGC率的利器 随着人工智能技术的飞速发展&#xff0c;越来越多的本科生在撰写论文时开始依赖AI工具。然而&#xff0c;使用AI生成的内容往往带有明显的“AI痕迹”&#xff0c;导致AIGC率偏…

作者头像 李华
网站建设 2026/6/15 15:17:09

Canoe在新能源汽车BMS测试中的实战案例

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 创建一个新能源汽车BMS测试案例展示页面。要求&#xff1a;1. 模拟CANoe测试环境 2. 展示电池电压/温度监控测试场景 3. 实现故障注入测试功能 4. 可视化测试结果统计 5. 包含测试报…

作者头像 李华
网站建设 2026/6/14 4:29:37

用PyCharm快捷键10分钟搭建数据可视化原型

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 创建一个快速数据可视化原型项目&#xff0c;使用PyCharm快捷键&#xff08;如CtrlAltV提取变量、CtrlShiftF全局搜索&#xff09;加速开发流程。项目应从CSV文件读取数据&#xff…

作者头像 李华