2026/5/21 1:31:27
网站建设
项目流程
网站设计教程及在线模拟器,网站建设费是,智通东莞人才网,做各企业网站大概多少钱针对上图阿里Java开发手册中的说明#xff0c;本文我来详细分析 MySQL EXPLAIN 中的 type 类型#xff0c;并按照性能从优到劣排序#xff1a;
#x1f4ca; MySQL EXPLAIN type 类型性能层级
#x1f3c6; 第1梯队#xff1a;最优性能
1. system
表中只有一行数据#…针对上图阿里Java开发手册中的说明本文我来详细分析 MySQL EXPLAIN 中的type类型并按照性能从优到劣排序MySQL EXPLAIN type 类型性能层级第1梯队最优性能1. system表中只有一行数据系统表这是最好的情况但很少见2. const通过主键或唯一索引进行等值查询最多只返回一条记录示例WHERE id 1id是主键优化阶段就能确定结果第2梯队优秀性能3. eq_ref多表连接时使用主键或唯一索引进行关联对于前表的每一行后表最多匹配一行常见于INNER JOIN中主键关联4. ref使用普通索引进行等值查询可能返回多条记录示例WHERE name 张三name有普通索引第3梯队可接受性能5. range对索引进行范围扫描示例WHERE id 100、BETWEEN、IN等比全表扫描好得多⚠️第4梯队需要优化6. index索引全扫描扫描整个索引树虽然比全表扫描快因为索引通常比表小但仍然是线性扫描性能较差示例SELECT id FROM tableid是索引7. ALL全表扫描性能最差需要扫描所有数据行数据量大时非常缓慢性能对比表级别 | 扫描方式 | 性能 | 说明 -----------|------------------|----------|------------------- system | 系统表 | ★★★★★ | 只有一行 const | 主键/唯一索引等值 | ★★★★☆ | 最多一行 eq_ref | 主键关联 | ★★★★☆ | 连接优化 ref | 普通索引等值 | ★★★☆☆ | 推荐目标 range | 索引范围 | ★★☆☆☆ | 最低要求 index | 索引全扫描 | ★☆☆☆☆ | 需要优化反例 ALL | 全表扫描 | ☆☆☆☆☆ | 必须优化如何从 type 判断查询效率✅好的情况const/eq_ref最优秒级响应ref良好毫秒级响应range可接受数据量大时可能需要优化❌差的情况index虽然比 ALL 好但仍是线性扫描ALL必须优化否则会随数据量增长而急剧变慢优化建议1.至少达到 range 级别-- 优化前可能 typeALLSELECT*FROMusersWHEREage25;-- 优化后typerange-- 给 age 字段添加索引CREATEINDEXidx_ageONusers(age);2.争取达到 ref 级别-- 优化前typerange因为用了范围查询SELECT*FROMordersWHEREuser_idIN(1,2,3);-- 如果业务允许改为等值查询SELECT*FROMordersWHEREuser_id1;3.尽可能达到 const-- 使用主键或唯一索引SELECT*FROMusersWHEREid1;SELECT*FROMusersWHEREemailuserexample.com;-- email需是唯一索引实际查询示例分析-- 假设 users 表有-- id (主键), name (普通索引), age (无索引), email (唯一索引)EXPLAINSELECT*FROMusersWHEREid1;-- type: const ✓ (最优)EXPLAINSELECT*FROMusersWHEREemailtestexample.com;-- type: const ✓EXPLAINSELECT*FROMusersWHEREname张三;-- type: ref ✓ (良好)EXPLAINSELECT*FROMusersWHEREage25;-- type: ALL ✗ (需要给 age 加索引)EXPLAINSELECTidFROMusers;-- type: index ✗ (虽然只查索引列但仍是全索引扫描)总结关键点const ref range index ALL性能递减目标至少达到range争取达到ref最好是constindex 类型并不好虽然是扫描索引但仍是线性扫描特别是大数据表时要避免优化手段添加合适的索引、改写查询条件、避免全表扫描