当前位置: 首页 > news >正文

SQL 执行慢?别急着加索引,先看 Explain 执行计划

SQL 执行慢?别急着加索引,先看 Explain 执行计划

慢 SQL 不是玄学。每条慢查询背后,都有一个明确的"罪魁祸首"。

而找出它的第一步,不是改代码,是执行一句EXPLAIN


先学会看这张表

执行EXPLAIN SELECT ...,你会得到一张结果表。

只看这几列就够了:

列名含义什么值是好的
type访问类型,决定了查询方式const>eq_ref>ref>range>index>ALL
key实际用了哪个索引有索引名,别是NULL
rows扫描了多少行越少越好
Extra额外信息,藏着很多坑见下文详解

一、type:最关键的一列

它直接告诉你数据库是怎么找数据的。

从好到差排个序:

type含义评价
system只有一行,表只有一条记录极好,几乎不会慢
const主键或唯一索引等值查询极好,一步到位
eq_ref唯一索引关联查询很好
ref非唯一索引等值查询良好,大多数场景够用
range索引范围扫描(BETWEEN>IN可接受
index全索引扫描,不回表数据量小可以,大了就慢
ALL全表扫描这就是慢的根源

一句话type到达ALL,说明没用索引,优先优化这里。


二、rows:扫描了多少行

这个数字越小越好。

  • rows = 1:精准命中,完美。
  • rows = 几百:还行,看场景。
  • rows = 几万/几十万:大概率要出问题。

关键对比

rows = 10, 实际返回 10 行 → 健康 rows = 100000, 实际返回 1 行 → 严重浪费,索引没选对

扫描行数和返回行数差距越大,说明索引越没用到位。


三、Extra:最容易忽略的"暗号"

这一列藏着真正的排查线索。

含义怎么处理
Using index覆盖索引,不用回表✅ 最佳状态,不用改
Using where存储引擎层过滤后,Server 层还要再过滤⚠️ 索引不够精准
Using index condition索引下推(ICP),5.6+ 支持✅ 还不错
Using filesort需要额外排序,没用上索引排序❌ 加索引或改ORDER BY
Using temporary用了临时表,常见于GROUP BY/DISTINCT❌ 优化分组逻辑或加索引
Using join buffer用了 Join Buffer,没走索引关联❌ 被驱动表没索引,补上

出现Using filesortUsing temporary,90% 的情况是索引没建对。


四、实战:一条慢 SQL 怎么拆

假设这条 SQL 跑了 8 秒:

sql

SELECT u.name, o.amount FROM users u JOIN orders o ON u.id = o.user_id WHERE o.created_at > '2026-01-01' ORDER BY o.amount DESC LIMIT 10;

执行EXPLAIN,结果:

idselect_typetabletypekeyrowsExtra
1SIMPLEoALLNULL500000Using where; Using filesort
1SIMPLEueq_refPRIMARY1

诊断

  1. orderstype = ALL,全表扫描 50 万行 →没用索引
  2. Extra = Using filesort,排序没用上索引 →ORDER BY没索引支撑

优化

sql

-- 给 orders 表加联合索引 ALTER TABLE orders ADD INDEX idx_created_amount (created_at, amount DESC);

再看EXPLAIN

tabletypekeyrowsExtra
orangeidx_created_amount320Using index condition
ueq_refPRIMARY1
  • typeALL变成range
  • rows从 50 万降到 320。
  • Extra出现Using index condition,不再filesort

8 秒 → 0.01 秒,就改了一个索引。


五、排查流程(记住这条链路)

SQL 慢 └─ EXPLAIN 看 type ├─ type = ALL → 没走索引,查 key 列,补索引 ├─ type = index → 全索引扫描,看是否需要回表 └─ type 够好但仍慢 → 看 rows 和 Extra ├─ Using filesort → ORDER BY 没索引 ├─ Using temporary → GROUP BY 没索引 └─ Using join buffer → 被驱动表缺索引

最后一句话

慢 SQL 的答案,80% 藏在EXPLAINtypeExtra里。先看执行计划,再动手改,别上来就加索引。

http://www.jsqmd.com/news/918132/

相关文章:

  • 揭秘3大核心技术:Android固件逆向工程实战指南
  • 【限时释放】AI工具订阅优化决策树(含18个分支判定逻辑):覆盖中小企/集团/出海团队三类架构,仅开放72小时下载
  • JustOne--一款类OneForAll的子域名收集工具
  • ROFL-Player深度解析:英雄联盟回放文件的架构设计与实现原理
  • 用户故事写不好?Gemini提示工程+INVEST原则双引擎驱动,3天重构需求质量,你还在手动拍脑袋吗?
  • 别再只调白平衡了!用OpenCV和Kalibr搞定红外热成像摄像头的温度标定(附完整代码)
  • 知乎内容终极备份方案:如何完整保存你的知识资产
  • 如何用Mem Reduct让你的Windows电脑内存效率提升300%:新手完全指南
  • 3分钟解锁游戏性能潜力:DLSS Swapper智能管理方案
  • 安全库存怎么设定?供应链库存管理的核心参数? - 众智商学院职业教育
  • ESP32与RP2040双核协同打造旋转LED屏:从无线供电到视觉暂留全解析
  • 同一个实验,同样的protocol,为什么结果总是不一样?
  • 终极指南:三步搞定小说离线阅读,novel-downloader让你的数字图书馆永不消失
  • 2026西安黄金回收避雷红黑榜:深扒哪家套路深,千万别去A要去B,到底怎么选不踩坑? - 西安闲转记
  • 实验室建设选EPC还是分包 关键在这里
  • 掌握Windows系统管理艺术:Chris Titus Tech WinUtil深度实战指南
  • 别再瞎调了!Unity UI自适应保姆级教程:Canvas Scaler三种模式实战对比(附避坑清单)
  • 音乐解锁终极指南:3分钟掌握12种加密格式免费转换
  • 5分钟快速上手:用AutoMdxBuilder轻松制作专业MDX词典
  • 【基础知识】Python入门:序列
  • 2026年4月有名的塑料垃圾桶生产厂家口碑推荐,塑料周转框/塑料水箱/塑料周转筐/塑料垃圾桶,塑料垃圾桶厂家推荐分析 - 品牌推荐师
  • 201_002 Zynq7000 SoC PS资源介绍
  • 【AI工具故障排除黄金法则】:20年SRE专家亲授7大高频故障的秒级定位与修复流程
  • 杭州黄金回收哪家靠谱?拱墅、上城、萧山三店横评实录 - 百福黄金回收
  • 从零打造仿生机械手:Arduino控制与3D打印实战指南
  • 低调的黑客
  • 2026年杭州企业必看:如何选择可靠的GEO源码部署公司深度指南 - 品牌报告
  • D2DX:终极暗黑破坏神2现代化补丁,让经典游戏完美适配现代PC
  • 2026加拿大工程院院士:14位华人院士,占比1/4
  • 仅限技术决策者查阅:AI搜索引擎隐私SLA对比矩阵(含数据驻留地、第三方共享协议、删除SLA时效),17家厂商原始条款逐条标注