当前位置: 首页 > 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.rkmt.cn/news/1429454.html

相关文章:

  • 三步实现移动端AI部署:从模型选型到生产落地的实战指南
  • 【AI工具与MLOps整合实战指南】:20年MLOps专家亲授5大避坑法则,90%团队正在忽略的流水线断裂点
  • 用户故事写不好?Gemini提示工程+INVEST原则双引擎驱动,3天重构需求质量,你还在手动拍脑袋吗?
  • ROFL-Player深度解析:英雄联盟回放文件的架构设计与实现原理
  • 别再只调白平衡了!用OpenCV和Kalibr搞定红外热成像摄像头的温度标定(附完整代码)
  • ESP32与RP2040双核协同打造旋转LED屏:从无线供电到视觉暂留全解析
  • 2026西安黄金回收避雷红黑榜:深扒哪家套路深,千万别去A要去B,到底怎么选不踩坑? - 西安闲转记
  • 实验室建设选EPC还是分包 关键在这里
  • 2026年4月有名的塑料垃圾桶生产厂家口碑推荐,塑料周转框/塑料水箱/塑料周转筐/塑料垃圾桶,塑料垃圾桶厂家推荐分析 - 品牌推荐师
  • 【AI工具故障排除黄金法则】:20年SRE专家亲授7大高频故障的秒级定位与修复流程
  • 杭州黄金回收哪家靠谱?拱墅、上城、萧山三店横评实录 - 百福黄金回收
  • 2026年杭州企业必看:如何选择可靠的GEO源码部署公司深度指南 - 品牌报告
  • D2DX:终极暗黑破坏神2现代化补丁,让经典游戏完美适配现代PC
  • Claude 3.5究竟强在哪?弱在哪?(附237项原子能力打分矩阵):这份被3家FAANG内部传阅的竞品分析PDF正在失效
  • 浏览器如何解析HTML头部:底层逻辑揭秘
  • 上海防水施工安全有保障吗?芮生建设全员投保杜绝施工风险 - 十大品牌榜单
  • 如何将B站缓存视频从m4s格式转换为通用mp4:简单三步搞定
  • 佛山AI短视频哪个靠谱
  • 告别命令行的烦恼:用Pycharm可视化搞定GitHub项目上传与同步(含403/443错误解决)
  • 终极硬件侦探指南:如何与AMD Ryzen处理器深度对话
  • 番茄小说下载器完整指南:三步搞定离线阅读自由
  • 哔哩下载姬全攻略:3步掌握B站视频高效下载技巧
  • Alpine Linux Docker容器里怎么设置中文?一个命令解决中文乱码问题
  • 费城独立钟声响起:在历史名城的足球新篇
  • 如何快速实现CREO到URDF转换?creo2urdf工具的完整使用指南 [特殊字符]
  • 2026实测:专业降AIGC平台选这款就对了 - 降AI小能手
  • 矿用蓄电池双电机驱动铰接车辆动力系统协同控制策略【附仿真】
  • 基于Sentinel-2卫星影像的EuroSAT数据集:从深度学习基准到实际应用的全栈技术解析
  • 一家把“西餐厅体验“做成十几元快餐的门店
  • 大型挖泥船厂家直供吗 - 舒雯文化