EXPLAIN执行计划深度解读:从type到cost,彻底读懂SQL为什么慢

本文涉及的产品
PolarDB Agent Express,2核4GB
RDS DuckDB + QuickBI 企业套餐,8核32GB + QuickBI 专业版
RDS AI 助手,专业版
简介: 本期深入解析`EXPLAIN`核心字段:用`key_len`判断索引使用列数,借`filtered`评估回表代价,并详解MySQL 8.0的`EXPLAIN ANALYZE`如何以真实执行数据替代估算,让SQL优化更精准、可验证。

大家好,我是小耶。上周讲了EXPLAIN的3个必看字段,评论区不少朋友说“够用但还想深入”。今天就把它彻底拆开,讲讲key_len怎么判断用了索引的哪几列,filtered如何评估回表代价,以及MySQL 8.0的EXPLAIN ANALYZE为什么比传统EXPLAIN更准。

1 问题背景:为什么只靠type还不够?

在日常优化中,typeALL变成rangeref固然能大幅提升性能,但当多个索引可选时,优化器的选择是否正确?索引用了但扫描行数依然很大怎么办?这些仅靠传统EXPLAIN难以回答。

MySQL 8.0引入了EXPLAIN ANALYZE,可以输出实际执行的成本和时间;FORMAT=JSON则能展示优化器的代价估算。掌握这些,才能真正理解SQL慢在哪里。

2 核心概念:EXPLAIN输出列详解

以下列是按重要性排序的必看项:

  • type​:访问类型。从优到劣:system > const > eq_ref > ref > range > index > ALLALL代表全表扫描,必须优化。
  • possible_keys​:可能用到的索引。若为NULL,说明无可用的索引。
  • key​:实际使用的索引。若为NULL,代表未走索引。
  • key_len​:实际使用的索引字节数。可推算索引中具体用了哪几列(例如utf8mb4每字符4字节,key_len=4表示只用了第一列)。
  • rows​:预估需要扫描的行数。数字越大越慢。但此为估算值,与filtered配合可估算回表行数。
  • filtered​:存储引擎层返回的数据经过WHERE条件过滤后剩余的比例。例如rows=1000filtered=10.00,表示最终大约返回100行。如果filtered很低且索引不包含所有WHERE列,说明需要回表过滤大量数据,可考虑覆盖索引。
  • Extra​:附加信息。常见的有:

    • Using index:覆盖索引,不回表,好。
    • Using index condition:索引下推,较好。
    • Using where:需要回表过滤,通常正常。
    • Using filesort:需要额外排序,应优化。
    • Using temporary:使用临时表,应优化。
  • EXPLAIN ANALYZE​(MySQL 8.0.18+):实际执行查询并输出每个步骤的实际耗时、循环次数、返回行数等,比估算准确。格式示例:
    text

    -> Nested loop inner join  (actual time=0.1..0.2 rows=10 loops=1)
    

    注意:它会真实执行,生产环境慎用。

3 案例解析:从执行计划定位一个真实慢查询

3.1 问题SQL

SELECT * FROM orders WHERE user_id = 123 ORDER BY order_date DESC;

原索引为 (user_id)EXPLAIN结果:

type key rows Extra
ref idx_user_id 5000 Using filesort

rows=5000(该用户有5000条订单),Extra=Using filesort(因为order_date没有索引,需要额外排序)。经验证该查询耗时0.8秒。

3.2 优化过程

添加联合索引 (user_id, order_date)后:

type key rows Extra
ref idx_user_date 5000 (空)

无需filesort,耗时降至0.05秒。这里rows仍为5000,但Extra已无排序,且key_len可判断实际用了两列。

若需进一步优化,可改为覆盖索引 (user_id, order_date, status, amount) 避免回表,Extra会显示Using index

3.3 使用FORMAT=JSON查看代价

EXPLAIN FORMAT=JSON SELECT ...;

输出中的cost_info块展示了read_costeval_costprefix_cost,可比较不同索引的代价估算,帮助理解优化器决策。

4 总结与建议

  • 日常慢查询分析,先看typerows;若type不是ALLrows很大,检查filteredkey_lenExtra中出现Using filesortUsing temporary几乎总是需要优化。
  • MySQL 8.0用户可将EXPLAIN ANALYZE用于测试环境,获取真实执行成本。
  • 掌握这些,就不只是“能看懂”,而是能根据执行计划精准加索引或改写SQL。

理解执行计划是SQL调优的基石。从3个字段到全解读,你的优化能力会上一个台阶。

小耶在手,SQL 不愁。

还有什么想了解的,欢迎留言!小耶一定知无不言言无不尽……我们下次见~

相关文章
|
15天前
|
人工智能 JSON 供应链
畅用7个月无影 JVS Claw |手把手教你把JVS改造成「科研与产业地理情报可视化大师」
LucianaiB分享零成本畅用JVS Claw教程(学生认证享7个月使用权),并开源GeoMind项目——将JVS改造为科研与产业地理情报可视化AI助手,支持飞书文档解析、地理编码与腾讯地图可视化,助力产业关系图谱构建。
23512 12
畅用7个月无影 JVS Claw |手把手教你把JVS改造成「科研与产业地理情报可视化大师」
|
4天前
|
人工智能 BI 持续交付
Claude Code 深度适配 DeepSeek V4-Pro 实测:全场景通关与真实体验报告
在 AI 编程工具日趋主流的今天,Claude Code 凭借强大的任务执行、工具调用与工程化能力,成为开发者与自动化运维的核心效率工具。但随着原生模型账号稳定性问题频发,寻找一套兼容、稳定、能力在线的替代方案变得尤为重要。DeepSeek V4-Pro 作为新一代高性能大模型,提供了完整兼容 Claude 协议的 API 接口,只需简单配置即可无缝驱动 Claude Code,且在任务执行、工具调用、复杂流程处理上表现极为稳定。
1270 3
|
9天前
|
人工智能 缓存 Shell
Claude Code 全攻略:命令大全 + 实战工作流(完整版)
Claude Code 是一款运行在终端环境下的 AI 编码助手,能够直接在项目目录中理解代码结构、编辑文件、执行命令、执行开发计划,并支持持久化记忆、上下文压缩、后台任务、多模型切换等专业能力。对于日常开发、项目维护、快速重构、代码审查等场景,它可以大幅减少手动操作、提升编码效率。本文从常用命令、界面模式、核心指令、记忆机制、图片处理、进阶工作流等维度完整说明,帮助开发者快速上手并稳定使用。
2332 4
|
3天前
|
Shell API 开发工具
Claude Code 快速上手指南(新手友好版)
AI编程工具卷疯啦!Claude Code凭借任务驱动+终端原生的特性,成了开发者的效率搭子。本文从安装、登录、切换国产模型到常用命令,手把手带新手快速上手,全程避坑,30分钟独立用起来。
933 7
|
19天前
|
人工智能 缓存 BI
Claude Code + DeepSeek V4-Pro 真实评测:除了贵,没别的毛病
JeecgBoot AI专题研究 把 Claude Code 接入 DeepSeek V4Pro,跑完 Skills —— OA 审批、大屏、报表、部署 5 大实战场景后的真实体验 ![](https://oscimg.oschina.net/oscnet/up608d34aeb6bafc47f
5918 22
Claude Code + DeepSeek V4-Pro 真实评测:除了贵,没别的毛病
|
20天前
|
人工智能 JSON BI
DeepSeek V4 来了!超越 Claude Sonnet 4.5,赶紧对接 Claude Code 体验一把
JeecgBoot AI专题研究 把 Claude Code 接入 DeepSeek V4Pro 的真实体验与避坑记录 本文记录我将 Claude Code 对接 DeepSeek 最新模型(V4Pro)后的真实体验,测试了 Skills 自动化查询和积木报表 AI 建表两个场景——有惊喜,也踩
7097 16
|
2天前
|
人工智能 JSON BI
DeepSeek V4-Pro 接入 Claude Code 完全实战:体验、测试与关键避坑指南
Claude Code 作为当前主流的 AI 编程辅助工具,凭借强大的代码理解、工程执行与自动化能力深受开发者喜爱,但原生模型的使用成本相对较高。为了在保持能力的同时进一步降低开销,不少开发者开始寻找兼容度高、价格更友好的替代模型。DeepSeek V4 系列的发布带来了新的选择,该系列包含 V4-Pro 与 V4-Flash 两款模型,并提供了与 Anthropic 完全兼容的 API 接口,理论上只需简单修改配置,即可让 Claude Code 无缝切换为 DeepSeek 引擎。
769 0