news 2026/6/9 20:07:33

MySQL EXPLAIN type 类型性能层级分析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
MySQL EXPLAIN type 类型性能层级分析

针对上图阿里Java开发手册中的说明,本文我来详细分析 MySQL EXPLAIN 中的type类型,并按照性能从优到劣排序:

📊MySQL EXPLAIN type 类型性能层级

🏆第1梯队:最优性能

1. system
  • 表中只有一行数据(系统表)
  • 这是最好的情况,但很少见
2. const
  • 通过主键或唯一索引进行等值查询
  • 最多只返回一条记录
  • 示例:WHERE id = 1(id是主键)
  • 优化阶段就能确定结果

🥈第2梯队:优秀性能

3. eq_ref
  • 多表连接时,使用主键或唯一索引进行关联
  • 对于前表的每一行,后表最多匹配一行
  • 常见于INNER JOIN中主键关联
4. ref
  • 使用普通索引进行等值查询
  • 可能返回多条记录
  • 示例:WHERE name = '张三'(name有普通索引)

🥉第3梯队:可接受性能

5. range
  • 对索引进行范围扫描
  • 示例:WHERE id > 100BETWEENIN
  • 比全表扫描好得多

⚠️第4梯队:需要优化

6. index
  • 索引全扫描:扫描整个索引树
  • 虽然比全表扫描快(因为索引通常比表小)
  • 但仍然是线性扫描,性能较差
  • 示例:SELECT id FROM table(id是索引)
7. ALL
  • 全表扫描
  • 性能最差,需要扫描所有数据行
  • 数据量大时非常缓慢

📈性能对比表

级别 | 扫描方式 | 性能 | 说明 -----------|------------------|----------|------------------- system | 系统表 | ★★★★★ | 只有一行 const | 主键/唯一索引等值 | ★★★★☆ | 最多一行 eq_ref | 主键关联 | ★★★★☆ | 连接优化 ref | 普通索引等值 | ★★★☆☆ | 推荐目标 range | 索引范围 | ★★☆☆☆ | 最低要求 index | 索引全扫描 | ★☆☆☆☆ | 需要优化(反例) ALL | 全表扫描 | ☆☆☆☆☆ | 必须优化

🔍如何从 type 判断查询效率

好的情况

  • const/eq_ref:最优,秒级响应
  • ref:良好,毫秒级响应
  • range:可接受,数据量大时可能需要优化

差的情况

  • index:虽然比 ALL 好,但仍是线性扫描
  • ALL:必须优化,否则会随数据量增长而急剧变慢

💡优化建议

1.至少达到 range 级别

-- 优化前:可能 type=ALLSELECT*FROMusersWHEREage>25;-- 优化后:type=range-- 给 age 字段添加索引CREATEINDEXidx_ageONusers(age);

2.争取达到 ref 级别

-- 优化前:type=range(因为用了范围查询)SELECT*FROMordersWHEREuser_idIN(1,2,3);-- 如果业务允许,改为等值查询SELECT*FROMordersWHEREuser_id=1;

3.尽可能达到 const

-- 使用主键或唯一索引SELECT*FROMusersWHEREid=1;SELECT*FROMusersWHEREemail='user@example.com';-- email需是唯一索引

📝实际查询示例分析

-- 假设 users 表有:-- id (主键), name (普通索引), age (无索引), email (唯一索引)EXPLAINSELECT*FROMusersWHEREid=1;-- type: const ✓ (最优)EXPLAINSELECT*FROMusersWHEREemail='test@example.com';-- type: const ✓EXPLAINSELECT*FROMusersWHEREname='张三';-- type: ref ✓ (良好)EXPLAINSELECT*FROMusersWHEREage>25;-- type: ALL ✗ (需要给 age 加索引)EXPLAINSELECTidFROMusers;-- type: index ✗ (虽然只查索引列,但仍是全索引扫描)

🎯总结关键点

  1. const > ref > range > index > ALL(性能递减)
  2. 目标:至少达到range,争取达到ref,最好是const
  3. index 类型并不好:虽然是扫描索引,但仍是线性扫描,特别是大数据表时要避免
  4. 优化手段:添加合适的索引、改写查询条件、避免全表扫描
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 11:56:30

回溯+位运算|前缀和优化背包

汉字写一遍代码思路 可以提升和人沟通 和加深理解所以不可以只写完代码就去去丸了 还是要复习lc756class Solution { public:bool pyramidTransition(string bottom, vector<string>& allowed) {vector<int> groups[7][7];for (auto& s : allowed) {// A~F…

作者头像 李华
网站建设 2026/6/10 11:55:52

PostgreSQL 时间/日期处理指南

PostgreSQL 时间/日期处理指南 引言 PostgreSQL 是一款功能强大的开源关系型数据库系统,它提供了丰富的数据类型和功能,其中包括对时间/日期数据的支持。本文将详细介绍 PostgreSQL 中时间/日期类型的使用方法,包括数据类型、常用函数、操作和注意事项。 PostgreSQL 时间…

作者头像 李华
网站建设 2026/6/8 12:37:25

Doris资源组管理:精细化资源分配策略

Doris资源组管理:精细化资源分配的"食堂排队秘诀" 关键词:Doris资源组、精细化资源分配、查询优化、资源隔离、队列调度、Cgroup、多租户管理 摘要:当Doris作为大规模数据查询的"餐厅"时,如何让"食客"(查询)快速吃到"饭"(结果)…

作者头像 李华
网站建设 2026/6/7 20:54:16

毕业生都在用的十大降ai工具,建议收藏

家人们&#xff0c;现在学校查得是真严&#xff0c;不仅重复率&#xff0c;还得降ai率&#xff0c;学校规定必须得20%以下... 折腾了半个月&#xff0c;终于把市面上各类方法试了个遍&#xff0c;坑踩了不少&#xff0c;智商税也交了。今天这就把这份十大降AI工具合集掏心窝子…

作者头像 李华
网站建设 2026/5/9 14:14:36

fwrite与fflush作用

简单说&#xff1a; fwrite 负责“写数据”&#xff0c; fflush 负责“把缓冲里的内容真的推到文件/设备”。一、 fwrite 做什么&#xff1f;fwrite 是标准 C 里的带缓冲的文件写入函数&#xff0c;原型&#xff1a;csize_t fwrite(const void *ptr, size_t size, size_t nme…

作者头像 李华
网站建设 2026/6/10 12:50:35

《告别跨端运算偏差:游戏确定浮点数学库的核心搭建指南》

早期涉足游戏开发时,曾执着于浮点精度的极致提升,认为更高的精度就能消除所有差异,直到在一款多人协作游戏的测试中,见证过同一技能在PC端与移动端的伤害结算偏差、主机玩家与手机玩家看到的角色跳跃轨迹分歧—明明是相同的触发条件,却出现技能命中判定失效、物理道具飞行…

作者头像 李华