数据库 explain 关键字解析
目录一. explain 概述二. explain 关键字的使用方式三. explain 的版本迭代四. explain 只分析SQL语句不执行SQL语句五. explain 输出结果中各个字段的含义六. type 表示检索表数据的方式七. key_len表示使用的索引的长度八. rows 表示预估读取到的行数九. Extra 表示SQL执行时的一些额外信息一. explain 概述有些同学可能不知道我们在数据库中运行 SQL 语句时底层优化器会选择最优的执行方式来执行我们的 SQL 语句也就是说底层执行 SQL 语句的顺序并不一定跟我们写的 SQL 语句的顺序是一致的。MySQL 中有专门优化 SELECT 语句的优化器模块主要功能是通过计算分析系统中收集到的统计信息为客户端请求的 Query(查询) 提供它认为最优的执行计划。这里要注意一点这里最优的执行计划是服务器通过计算得出的但不见得是我们开发人员认为是最优的所以实际开发过程中我们的DBA不一定会采用它所提供的执行计划而是在所提供的执行计划上综合业务逻辑做一些调整而通过 explain 关键字就可以让我们知道数据库对 SQL 语句的执行计划是怎么样的比如多表连接的顺序是什么执行一条 SQL 语句时数据库在执行的时候先做什么再做什么都可以通过 explain 关键字来查看。explain 语句有很多的输出项我们就可以通过这些输出项的数据来对 SQL 语句做判断从而优化那些查询慢的 SQL 语句。二. explain 关键字的使用方式explain 关键字的使用方式极其简单我们只需要将它加在SQL 语句的最前面就可以了如下所示# 加在 SELECT 查询语句的前面 EXPLAIN SELECT * FROM t_patent WHERE pid 115; # 加在 DELETE 删除语句的前面 EXPLAIN DELETE FROM t_patent WHERE pid 110; # 加在 UPDATE 更新语句的前面 EXPLAIN UPDATE t_patent SET t_patent.patent_name 张三 WHERE pid 130;三. explain 的版本迭代1在 MySQL5.6.3 版本以前explain 只能分析 SELECT 语句的执行计划但是在 MySQL5.6.3 版本以后explain 不仅可以分析 SELECT 语句的执行计划还可以分析UPDATEDELETE语句的执行计划只是我们更多的是用于分析 SELECT 查询语句这一点作为了解即可2在 MySQL5.7 以前的版本中想要显示 partitions 需要使用 explain partitions 命令想要显示 filtered 需要使用 explain extended 命令。而 5.7 版本之后默认 explain 将直接显示 partitions 和 filtered 中的信息。也许现在有些同学还不 partitions 和 filtered 是什么这里先不用关心看到下面的讲解自然就会明白了。这里你先可以简单理解为在 5.7 版本之后explain 关键字做了增强explain 将另外两个关键字的功能也包含进去了不需要再像以前一样执行三个关键字。四. explain 只分析SQL语句不执行SQL语句这句话应该很好理解我们使用 explain 关键字执行一条语句时它只是输出当前 SQL 语句最优的执行计划但并没有真正的去执行这条 SQL 语句。我简单举个例子演示一下1如下为 patent 数据库中的 t_patent 表表中有一些数据2然后我使用 explain 关键字查询输出当前 DELETE 语句的执行计划运行成功输出了结果这里暂时不关心结果中的各个字段含义是什么3我们再来查询一下刚才 pid 110 的那条数据是否存在如下我们发现仍然可以查询到 pid 110 的这条数据。通过这个例子也证实了刚才的结论explain 只负责输出最优的执行计划但并没有真正的去执行 SQL 语句。五. explain 输出结果中各个字段的含义刚才在第四小节的演示中我们看到了执行 explain 会输出很多的字段一共有12个每个字段代表了不同的涵义列举如下在这12个字段中我们需要重点关注 typekey_lenrowsExtra 这个四个字段他们是面试过程中最容易问到的点而且是SQL语句调优的关键点我们的 SQL 的调优就是基于这个四个关键字段来调的。六. type 表示检索表数据的方式执行计划中的 type 的一条记录就代表 MySQL 对某个表执行查询时的访问方式也称访问类型。它有众多访问方式查询的效率从高到低依次是system const eq ref fulltext ref or null range index ALL在实际开发过程中我们希望一条 SQL 语句的查询效率越高越好大多数情况下应当把访问方式至少定位在 range 以上ALL(全表扫描)是我们最不希望看到的结果所以在编写 SQL 时要尽量避免此访问类型的发生。七. key_len表示使用的索引的长度key_len 通常应用于联合索引开发过程中一个表会有很多的字段为了提高查询效率我们会为查询频率较高的几个字段建立联合索引通过 explain 就可以得到使用而索引字段的长度从而得知当前SQL语句中都是用到了联合索引中的那个字段以便做进一步的优化。不同的类型的字段计算规则也不一样如下所示1字符串类型计算char(n)算作 n 个字节varchar如果是 utf-8 则算作 3n2 个字节如果是utf-mb4则算作 4n2 个字节2数值类型计算tinyint1字节smaillint2字节int4字节bigint8字节3事件类型计算date3字节timestamp4字节datetime8字节此外字段如果为空需要1个字段记录是否为空。通过 explain 得出的索引时应长度配合上述三种类型长度的计算我们就能精准得出联合索引中的那些字段被使用到那些没有被使用到可以进一步优化sql语句的编写提高程序运行效率。八. rows 表示预估读取到的行数rows 字段的值通常可以搭配 filtered 字段的值rows 表示预估会读取到的行数filtered 则表示经过条件筛选之后剩余记录条数的百分比而两者想成得出的结果通常就是我们最终查询所得到的数据行数。九. Extra 表示SQL执行时的一些额外信息这里的额外信息包含很多种如下1Using Index使用非主键索引数就可以查询到所需要的数据一般是覆盖索引即想要查询的数据都包含在非剧组索引数中不需要进行回表操作。2Using where不通过索引查询所需要的数据这句话也很好理解就是我们 where 筛选条件的字段不是索引字段。那么就会进行全表扫描即 type 字段值为 ALL。3Using index condition表示查询列不被索引覆盖where 条件中是一个索引范围查找过滤玩索引后会回表找到所有符合条件的数据行。例如 SELECT * FROM table where 主键 某个值这种 SQL 语句就符合上面这种情况4Using temporary表示在查询的过程中需要利用临时表来处理查询比如我们使用 union all 取两个表满足条件的并集得到的数据表实际上是一张临时表5Using filesort当查询中包含 order by 操作而且无法利用索引完成的排序操作时若数据量小就在内存中进行排序若数据量多就在硬盘中进行排序。当遇到 Using temporary 或 Using filesort 时我们可以通过添加索引对 SQL 进行优化。6Select table optimized away当我们通过聚合函数访问某些索引数据时在 Extra 中就会显示 Select table optimized away如果通过聚合函数访问普通非索引字段在 Extra 中就会显示 null。

相关新闻

常用资源环境生态地理空间数据开源下载地址整理

常用资源环境生态地理空间数据开源下载地址整理

上学时研究需要用到大量资源环境生态地理空间数据,曾经搜集了不少资料,但开源的数据鱼龙混杂,参差不齐,数据筛选、验证和使用花费了不少时间,着实需要整理一下,在此记录一下已经整理过的数据!有…

2026/7/16 18:24:37阅读更多 →
深入理解bytebuffer.js的API设计:flip、mark与reset方法的高级应用

深入理解bytebuffer.js的API设计:flip、mark与reset方法的高级应用

深入理解bytebuffer.js的API设计:flip、mark与reset方法的高级应用 【免费下载链接】bytebuffer.js A fast and complete ByteBuffer implementation using either ArrayBuffers in the browser or Buffers under node.js. 项目地址: https://gitcode.com/gh_mirr…

2026/7/16 18:24:37阅读更多 →
ImNodes入门教程:5分钟上手节点图开发的终极指南

ImNodes入门教程:5分钟上手节点图开发的终极指南

ImNodes入门教程:5分钟上手节点图开发的终极指南 【免费下载链接】ImNodes Node graph implementation for Dear ImGui. Used in https://github.com/rokups/rbfx 项目地址: https://gitcode.com/gh_mirrors/imn/ImNodes 想要在C项目中快速创建美观的节点图界…

2026/7/16 18:24:37阅读更多 →
WMPageController 使用教程

WMPageController 使用教程

WMPageController 使用教程 【免费下载链接】WMPageController An easy solution to page controllers like NetEase News 项目地址: https://gitcode.com/gh_mirrors/wm/WMPageController 1. 项目介绍 WMPageController 是一个开源的 iOS 项目,旨在为开发者…

2026/7/16 19:24:41阅读更多 →
Qt,C++海康2D工业相机二次开发

Qt,C++海康2D工业相机二次开发

1.先下载海康的MVS客户端,下载安装后路径下会自动有相应的安装包,包括头文件以及lib库文件 海康机器人-机器视觉-下载中心 2.在pro项目文件里面配置库文件以及头文件 INCLUDEPATH $$PWD/Hik_Includes DEPENDPATH $$PWD/Hik_Includes LIBS -L$$PWD/L…

2026/7/16 19:24:41阅读更多 →
AI直接“上手“数据库:电科金仓KES MCP Server落地实操

AI直接“上手“数据库:电科金仓KES MCP Server落地实操

“orders这张表上都有哪些字段?索引是怎么建的?” “帮我看看这条SQL慢在哪里。” “如果给user_id和status加个联合索引,执行计划会变吗?” 这些过去要让DBA或开发人员来回切工具、复制粘贴才能回答的问题,如今在TRAE…

2026/7/16 19:24:40阅读更多 →
【JAVA毕设源码分享】基于Java的停车场管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

【JAVA毕设源码分享】基于Java的停车场管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/16 19:24:40阅读更多 →
【JAVA毕设源码分享】基于JavaWeb的点餐系统的设计与实现(程序+文档+代码讲解+一条龙定制)

【JAVA毕设源码分享】基于JavaWeb的点餐系统的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/16 19:24:40阅读更多 →
技术型创始人的市场感知框架:从趋势信号到商业机会的系统化转化

技术型创始人的市场感知框架:从趋势信号到商业机会的系统化转化

技术型创始人的市场感知框架:从趋势信号到商业机会的系统化转化 一、技术直觉的两面性:为什么技术型创始人容易错判市场 技术出身的创始人,最危险的时刻不是代码写不出来,而是用技术视角替代市场判断。一个典型的决策模式是&#…

2026/7/16 19:19:40阅读更多 →
VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异当你在VSCode中启动一个新的TypeScript项目时,第一个技术决策往往从安装方式开始。这个看似简单的选择——全局安装还是项目本地安装——实际上会深刻影响你的开发流程、团队协作和…

2026/7/16 8:28:11阅读更多 →
智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手 【免费下载链接】zhihuishu 智慧树刷课插件,自动播放下一集、1.5倍速度、无声 项目地址: https://gitcode.com/gh_mirrors/zh/zhihuishu 智慧树刷课插件是一款专为智慧树在线教育平台设计的Chrome浏…

2026/7/16 6:53:04阅读更多 →
Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 你是否在GOG或Epic Games Store购买了心仪的游戏…

2026/7/16 12:02:41阅读更多 →
A--10 Codex Review与GitHub PR工作流实战指南:从代码审查到安全合并

A--10 Codex Review与GitHub PR工作流实战指南:从代码审查到安全合并

摘要:本文系统讲解如何利用Codex App的Review功能与GitHub PR工作流,实现从代码修改到安全合并的完整流程。涵盖Review面板深度使用、/review命令实战、GitHub Connector配置、PR描述撰写技巧,以及常见问题排查方法。通过多个实战案例和流程图,帮助开发者建立高效的AI辅助代…

2026/7/16 0:00:38阅读更多 →
遗传算法解5皇后问题:从Hello World到工业优化的进化实验室

遗传算法解5皇后问题:从Hello World到工业优化的进化实验室

1. 项目概述:为什么用遗传算法解5皇后问题,而不是直接回溯?我带过十几届算法课,也给不少初创团队做过AI架构咨询。每次讲到组合优化问题,学生和工程师的第一反应永远是“写个回溯试试”。这没错——55棋盘上找所有合法…

2026/7/16 0:00:38阅读更多 →
5.1V稳压管输出为何只有4.7V?工作电流与负载影响分析

5.1V稳压管输出为何只有4.7V?工作电流与负载影响分析

前几天调试一个简单的电源模块,用到了5.1V稳压管。电路接好,上电测试,万用表一量——输出居然只有4.7V。第一反应是稳压管坏了,换了一个新的,结果还是4.7V。这让我想起很多初学者都会遇到的困惑:明明标称5.…

2026/7/16 0:00:38阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/15 15:50:47阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/16 8:58:42阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/16 17:10:26阅读更多 →