新闻中心

mysql如何使用explain分析SQL

2025-10-18
浏览次数:
返回列表
EXPLAIN是分析MySQL查询执行计划的关键命令,通过在SELECT、UPDATE等语句前添加EXPLAIN可查看其执行过程。输出字段中,id表示查询标识符,select_type显示查询类型如SIMPLE或PRIMARY,table为涉及的表名,type反映访问类型,理想为const或range,避免ALL全表扫描。possible_keys和key分别指出可能使用和实际使用的索引,key_len显示索引长度,ref标识被引用的列或常量,rows为扫描行数估算值,filtered表示过滤后的行比例,Extra提供额外信息如Using index(覆盖索引)或Using filesort(需排序)。例如对users表执行EXPLAIN SELECT name FROM users WHERE age > 30 AND city = 'Beijing',若type为range且key使用idx_age_city联合索引,则性能较优;否则可添加复合索引优化。MySQL 5.6+支持EXPLAIN FORMAT=JSON获取更详细信息,MySQL 8.0+引入EXPLAIN ANALYZE实际执行并返回真实耗时,有助于精准调优。掌握EXPLAIN有助于识别全表扫描、缺失索引等问题,进而优化SQL性能。

mysql如何使用explain分析sql

在 MySQL 中,EXPLAIN 是一个非常实用的命令,用于分析 SQL 查询的执行计划。通过它,你可以了解 MySQL 如何执行某条 SELECT、UPDATE、DELETE 或 INSERT 语句,从而判断是否存在性能瓶颈,比如全表扫描、缺少索引、错误的连接顺序等。

1. 使用 EXPLAIN 的基本语法

只需在 SQL 语句前加上 EXPLAIN 关键字:

EXPLAIN SELECT * FROM users WHERE id = 1;

执行后会返回一个结果集,每一列表示查询执行过程中的某个信息项。

2. EXPLAIN 输出字段详解

以下是常见列及其含义:

id: 查询的标识符。如果存在子查询或联合查询,每个部分都有一个 ID,ID 相同的执行顺序从上到下,ID 越大越先执行。

select_type: 查询类型,常见值包括:

  • SIMPLE:简单查询(不包含子查询或 UNION)
  • PRIMARY:主查询(最外层的查询)
  • SUBQUERY:子查询中的第一个 SELECT
  • DERIVED:派生表(如子查询在 FROM 中)
  • UNION:UNION 中的第二个或之后的查询

table: 查询涉及的表名。如果是派生表,会显示为 这类格式。

partitions: 匹配的分区(如果使用了分区表),一般为空表示未分区。

type: 表的访问类型,这是判断查询性能的关键指标,从最优到最差:

  • system:仅有一行系统表(如常量表)
  • const:通过主键或唯一索引定位一行
  • eq_ref:在 JOIN 中使用主键或唯一索引匹配一行
  • ref:非唯一索引等值匹配,可能返回多行
  • range:索引范围扫描(如 BETWEEN、IN、> 等)
  • index:全索引扫描(比 ALL 快,因为只扫索引树)
  • ALL:全表扫描,应尽量避免

possible_keys: 可能使用的索引。如果为 NULL,说明没有相关索引可用。

key: 实际使用的索引。如果为 NULL,表示未使用索引。

key_len: 使用索引的长度(字节)。可用于判断复合索引的使用情况。例如,INT 类型通常占 4 字节,VARCHAR(255) 在 utf8mb4 下最多占 1020 字节。

ref: 显示索引哪一列被使用了,或者是一个常量值(如 const)。

rows: 扫描的行数估算值。这个值越小越好。注意是“估算”,不一定精确。

PHP高级开发技巧与范例 PHP高级开发技巧与范例

PHP是一种功能强大的网络程序设计语言,而且易学易用,移植性和可扩展性也都非常优秀,本书将为读者详细介绍PHP编程。 全书分为预备篇、开始篇和加速篇三大部分,共9章。预备篇主要介绍一些学习PHP语言的预备知识以及PHP运行平台的架设;开始篇则较为详细地向读者介绍PKP语言的基本语法和常用函数,以及用PHP如何对MySQL数据库进行操作;加速篇则通过对典型实例的介绍来使读者全面掌握PHP。 本书

PHP高级开发技巧与范例 486 查看详情 PHP高级开发技巧与范例

filtered: 表示经过 WHERE 条件过滤后剩余的行百分比(基于统计信息估算)。100 表示全部保留,10 表示只剩 10%。

Extra: 额外信息,非常重要,常见值有:

  • Using where:使用 WHERE 条件过滤数据
  • Using index:使用了覆盖索引(无需回表)
  • Using index condition:使用索引条件下推(ICP)
  • Using temporary:需要创建临时表(如 GROUP BY 或 ORDER BY 涉及非索引列)
  • Using filesort:需要排序操作(影响性能,应优化)
  • Using join buffer:使用了连接缓存(通常正常)

3. 实际分析案例

假设有一个用户表:

CREATE TABLE users ( id INT PRIMARY KEY, name VARCHAR(50), age INT, city VARCHAR(50), INDEX idx_age (age), INDEX idx_city (city) );

执行:

EXPLAIN SELECT name FROM users WHERE age > 30 AND city = 'Beijing';

观察输出:

  • type 为 index 或 range?理想是 range
  • key 是否使用了复合索引?当前有两个单列索引,可能只用一个
  • Extra 是否出现 Using where;Using filesort?可考虑建立联合索引优化

优化建议:添加联合索引:

ALTER TABLE users ADD INDEX idx_age_city (age, city);

再次执行 EXPLAIN,观察 key 是否变为 idx_age_city,type 是否为 range,Extra 是否减少 filesort 或 temporary。

4. EXPLAIN 的扩展用法

MySQL 5.6+ 支持 EXPLAIN FORMAT=JSON,提供更详细的执行计划,包括成本估算、索引使用细节等:

EXPLAIN FORMAT=JSON SELECT * FROM users WHERE age > 30;

此外还有 EXPLAIN ANALYZE(MySQL 8.0+),它会实际执行 SQL 并返回真实耗时信息,比普通 EXPLAIN 更准确。

用法:

EXPLAIN ANALYZE SELECT * FROM users WHERE age > 30;

注意:ANALYZE 会真正执行语句,写操作需谨慎。

总结

EXPLAIN 是 SQL 性能调优的起点。重点关注 type(避免 ALL)、key(是否命中索引)、rows(扫描行数)和 Extra(避免 temporary、filesort)。结合业务场景不断调整索引结构,才能写出高效的 SQL。

基本上就这些,掌握 EXPLAIN 后,SQL 优化就有了方向。

以上就是mysql如何使用explain分析SQL的详细内容,更多请关注其它相关文章!


# 行数  # 建设通网站登录不上  # 东阳seo优化教学  # 保定网站推广v1  # 温州seo优化费用  # 宣城seo关键词推广  # 网站怎么做更高端的推广  # 浙江龙元建设集团网站  # 啤酒营销推广词语有哪些  # 山南seo公司选择12火星  # 韶关seo网络优化公司  # 主键  # 全攻略  # 分区表  # mysql  # 多个  # 本书  # 如何使用  # 使用了  # 镜像  # 离线  # red  # 性能瓶颈  # ai  # 字节  # json  # js 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: 4399免费游戏网址入口 4399小游戏免费入口点开即玩  顺丰国际快递查询 国际件官方查询入口  写好的html代码怎么运行出来_运行写好的html代码方法【教程】  优化Log4j2控制台输出性能:解决异步日志瓶颈  PowerPoint如何制作滚动字幕结尾彩蛋_PowerPoint路径动画实现平滑滚动字幕效果  Win11输入法不见了怎么办_Windows11恢复语言栏显示方法  mysql通配符支持数字匹配吗_mysql通配符能否用于数字匹配的解析  汽水音乐在线版入口_汽水音乐网页播放手册  Windows7怎么硬盘安装 Windows7提取ISO镜像到非系统盘并运行setup.exe实现硬盘直装【教程】  C++ string find函数返回值npos详解_C++字符串查找失败的判断条件  J*aScript中正确使用querySelectorAll与复杂CSS选择器  1688商家版怎样分析买家画像精准供货_1688商家版分析买家画像精准供货【供货策略】  天猫2025双十一0点秒杀攻略 天猫爆款抢购时间  HTML长属性值处理:表单action路径优化与代码规范应对  如何高效处理PHP中的Excel数据导入导出?PortPHP/Spreadsheet助你轻松搞定!  地铁跑酷免费秒玩入口链接 地铁跑酷小游戏免费秒玩网站  一加手机电池耗电快怎么办_一加手机电池耗电快的解决方法  Golang如何使用net/url解析URL_Golang URL解析与处理方法  必由学登录入口 必由学官方网站在线访问链接  CSS图片焦点样式实现教程:理解与应用tabindex属性  怎么在浏览器上运行HTML文件_浏览器运行HTML文件技巧【技巧】  必由学官网快捷入口 必由学网页版在线学习平台  微信怎么把收藏的内容分类管理 微信收藏内容标签分类方法  Golang如何通过reflect获取匿名字段方法_Golang reflect匿名字段方法访问技巧  sublime如何配置Python开发环境_将sublime打造成轻量级Python IDE  海棠电脑版入口_通过电脑访问海棠官网阅读  抖音网页版怎么|直播|_抖音网页版开播操作指南  抖音创作助手登录入口_抖音创作辅助工具官网直达  React Router v6 教程:构建认证保护的私有路由与重定向策略  从OpenAI API响应中高效提取生成文本  汽水音乐车机版8.9下载 汽水音乐车机版8.9版本安装入口  J*aScript中如何高效提取对象指定属性  QQ邮箱官方登录入口_QQ邮箱网页版快捷使用平台  Lar*el Form Request中唯一性验证在更新操作中的正确实现  MAC如何将整个网页截长图_MAC使用Safari的导出为PDF或第三方工具  Bing引擎入口最新2025 Bing搜索免费官方登录  j*a toString()的覆盖  Lar*el如何正确地在控制器和模型之间分配逻辑_Lar*el代码职责分离与架构建议  优化Django表单:提交验证失败后保留用户输入  消息称三星明年 2 月正式发布 HBM4,与 SK 海力士同台竞技  解决深度学习模型训练初期异常高损失与完美验证准确率问题  J*a如何使用AtomicInteger控制计数_J*a无锁计数器性能分析  Python实时数据流中的动态最值查找策略  zookeeper 都有哪些功能?  浏览器打开即用 美图秀秀网页版入口  C++ typeid如何获取类型信息_C++ RTTI运行时类型识别用法  Golang如何实现简单的Web表单_Golang表单提交与验证处理方法  百度网盘网页版入口 百度网盘网页版官方登录网址  composer的"require-dev"部分是用来做什么的?  Lar*el如何生成PDF或Excel文件_Lar*el文档导出工具与使用教程 

搜索