别再盯着EXPLAIN的rows列了,8.0.18之后有更好的选择

简介: EXPLAIN是DBA最常用的工具之一,但大多数人还在看type、rows、Extra这些传统字段——然后靠经验猜。MySQL 8.0.18开始引入的EXPLAIN ANALYZE,直接把实际执行时间和行数输出给你看,不用猜了。本文对比传统EXPLAIN和EXPLAIN ANALYZE的差异,展示如何用新工具把执行计划分析这件事从“猜”变成“看”。

大家好,我是小耶,写功课只是为了我踩过的坑,你们别再踩了!

前两天一个同事跑过来问我:“小耶,你看这个执行计划,type是ref,rows是1000,Extra里用了索引,为啥还是慢?”

我看了眼SQL,又看了眼他的执行计划,问了一句:“你用的是EXPLAIN还是EXPLAIN ANALYZE?”

他说:“EXPLAIN啊,用了十几年了。”

——问题就出在这儿。

EXPLAIN给你看的是“优化器的预测”,不是“实际执行的结果” 。优化器说rows=1000,实际可能扫了100万行;优化器说用索引,实际可能回表回了10万次。

MySQL 8.0.18开始引入的EXPLAIN ANALYZE,直接把实际执行时间和实际行数输出给你看,把执行计划分析这件事从“猜”变成了“看”。

一、传统EXPLAIN的局限

传统的EXPLAIN输出,你看到的是:

id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE orders ref idx_user_id idx_user_id 4 const 1000 Using index condition

rows=1000 —— 这是优化器估算的需要扫描的行数,不是实际扫描的行数。

如果统计信息过期、数据分布倾斜、或者优化器的基数估算出了偏差,这个数字可能和实际情况差一个数量级。

你基于一个错误的估算去优化,方向可能从一开始就偏了。

二、EXPLAIN ANALYZE带来了什么

EXPLAIN ANALYZE实际上会执行SQL(是的,它会真的跑一遍),然后输出每个执行步骤的实际执行统计信息

EXPLAIN ANALYZE
SELECT * FROM orders WHERE user_id = 12345 AND create_time > '2026-01-01';

输出示例(MySQL 8.0+):

-> Filter: (orders.create_time > '2026-01-01')  (cost=1234 rows=1000) (actual time=0.5..45.2 rows=856 loops=1)
    -> Index lookup on orders using idx_user_id (user_id=12345)  (cost=1234 rows=1000) (actual time=0.4..42.1 rows=12345 loops=1)

关键差异:

传统EXPLAIN EXPLAIN ANALYZE
估算行数(rows) 实际行数(actual rows)
估算成本(cost) 实际执行时间(actual time)
只看计划 看到每个步骤的真实开销

在上面这个例子里,优化器估算rows=1000,实际扫描了rows=12345——差了12倍。如果你只看传统EXPLAIN,可能觉得“只扫1000行,没问题”,但实际上回表回了1万多行,慢是必然的。

三、怎么用EXPLAIN ANALYZE定位问题

第一步:找到最慢的那个步骤

actual time告诉你每个步骤实际花了多少毫秒。哪一步时间最长,哪一步就是瓶颈。

第二步:对比估算值和实际值

如果rowsactual rows差距很大(比如差10倍以上),说明统计信息可能过期了——先更新统计信息,再看看执行计划有没有变化。

第三步:看loops

loops表示这个步骤被执行了多少次。如果loops很大(比如>1000),说明有大量的重复执行——可能是嵌套循环连接(Nested Loop Join)的驱动表选错了,或者子查询被反复执行。

四、注意事项

  • EXPLAIN ANALYZE实际执行SQL,所以不要在写操作上直接跑——先在测试环境或只读从库上验证

  • 对于耗时很长的SQL,EXPLAIN ANALYZE本身也要跑那么久,要有耐心

  • MySQL 5.7及以下版本不支持,需要升级到8.0.18+

  • EXPLAIN ANALYZE的输出比传统EXPLAIN详细得多,需要花时间熟悉格式

五、小结

EXPLAIN用了十几年,是时候升级到EXPLAIN ANALYZE了。前者给你看“优化器的预测”,后者给你看“实际执行的结果”。从“猜”到“看”,这是执行计划分析这件事上最大的认知升级。

小耶在手,SQL 不愁

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

相关文章
|
2月前
|
Web App开发 人工智能 缓存
自研 AOQ 协议,为多模态 AI 构建确定性传输底座
AOQ(AI Over QUIC)是专为多模态AI设计的自研传输协议,首创“实时+非实时”双模自适应机制,支持文本、音视频、文件全格式统一承载与强同步。基于QUIC深度优化,具备0-RTT建连、流级容错、智能带宽调度等能力,60%高丢包下仍保障流畅交互,突破弱网瓶颈,实现低延迟、高可靠、强同步三者兼得。
706 1
|
12月前
|
数据采集 算法 数据挖掘
【场景削减】基于DBSCAN密度聚类风电-负荷确定性场景缩减方法(Matlab代码实现)
【场景削减】基于DBSCAN密度聚类风电-负荷确定性场景缩减方法(Matlab代码实现)
386 0
|
11月前
|
Shell 网络安全 开发工具
服务器已经搭建好的项目如何关联至gitee对应仓库并且将服务器的项目代码推送至gitee-优雅草卓伊凡
服务器已经搭建好的项目如何关联至gitee对应仓库并且将服务器的项目代码推送至gitee-优雅草卓伊凡
654 5
|
人工智能 Python
【02】做一个精美的打飞机小游戏,python开发小游戏-鹰击长空—优雅草央千澈-持续更新-分享源代码和游戏包供游玩-记录完整开发过程-用做好的素材来完善鹰击长空1.0.1版本
【02】做一个精美的打飞机小游戏,python开发小游戏-鹰击长空—优雅草央千澈-持续更新-分享源代码和游戏包供游玩-记录完整开发过程-用做好的素材来完善鹰击长空1.0.1版本
1056 7
|
人工智能 自然语言处理 机器人
自一致性提示技术:让AI像老师一样反复确认
想让AI给出更准确的答案?试试自一致性提示技术!就像找三个朋友帮你做同一道数学题,然后看谁的答案出现最多次。这个看似'折磨'AI的方法,却能让它变得更聪明、更可靠。本文用轻松幽默的方式,带你掌握这个让AI自我验证的神奇技巧。
715 3
|
存储 Linux 数据安全/隐私保护
确定CentOS系统分区表类型(MBR或GPT)
以上方法均能够帮助用户准确地识别出CentOS下连接硬件所应用得具体磁盘标准,并根据实际需求做进一步处理与管理工作。
1234 0
|
小程序
【04】微信支付商户申请下户到配置完整流程-微信开放平台移动APP应用通过-微信商户继续申请-微信开户函-视频声明-以及对公打款验证-申请+配置完整流程-优雅草卓伊凡
【04】微信支付商户申请下户到配置完整流程-微信开放平台移动APP应用通过-微信商户继续申请-微信开户函-视频声明-以及对公打款验证-申请+配置完整流程-优雅草卓伊凡
1402 1
【04】微信支付商户申请下户到配置完整流程-微信开放平台移动APP应用通过-微信商户继续申请-微信开户函-视频声明-以及对公打款验证-申请+配置完整流程-优雅草卓伊凡
|
人工智能 JavaScript 安全
【01】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-需求改为思维导图-设计数据库-确定基础架构和设计-优雅草卓伊凡商业项目实战
【01】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-需求改为思维导图-设计数据库-确定基础架构和设计-优雅草卓伊凡商业项目实战
1248 13
【01】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-需求改为思维导图-设计数据库-确定基础架构和设计-优雅草卓伊凡商业项目实战
|
Web App开发 编解码 算法
怎么实现实时无延迟的体育电竞动画直播
实时无延迟动画直播需关注技术方案、实现步骤与专业解决方案。技术上可选WebRTC(低至100-500ms延迟,互动性强)、低延迟HLS/CMAF(1-3秒延迟,兼容性好)和RTMP(传统协议,2-5秒延迟)。实现步骤包括采集端设置(高性能编码、稳定网络)、传输优化(CDN节点选择、抗丢包协议)及播放端优化(低延迟模式、自适应码率)。专业方案有云服务(AWS、Azure、阿里云)和专用平台(Millicast、Wowza)。注意完全无延迟不可行,需权衡画质与稳定性,并考虑终端兼容性和成本。代码示例展示了比赛数据处理逻辑,涉及匹配ID、状态、计划与关注等功能。
818 11