首页/数据/数据库速查/type 访问类型分级(从好到坏)
性能与调优57 条

type 访问类型分级(从好到坏)

type 直接决定性能档位:system/const/eq_ref/ref 优秀,range 尚可,index/ALL 需要警惕;优化目标是把关键路径推到 ref/range 以内。

数据库速查数据更新于 2026-10-13

访问类型分级

访问类型是执行计划里最直观的性能档位,它描述优化器打算怎么找到满足条件的行:从常量查找、唯一索引等值匹配、普通索引等值匹配、索引范围扫描,一路到全索引扫描与全表扫描。优化的目标就是把关键查询的档位推进到等值或范围这一档。但它不是唯一标准——小表全扫可能比走索引更快,判断时要结合扫描行数与表规模。

基本信息

用途判断语句的访问方式与性能档位
从好到差常量 → 唯一索引等值 → 普通索引等值 → 范围 → 全索引扫描 → 全表扫描
关键判断是否走了索引,扫描行数处于什么量级
常见误区把全索引扫描当成走了索引就没问题
观察方法查看执行计划中对应的那一列
版本差异主流版本取值一致

典型使用场景

  • 慢查询优化第一步:先看档位,再决定补索引还是改写法
  • 索引上线验收:确认档位从全表扫描提升到等值匹配
  • 连表查询排查:被驱动表是否用了唯一索引匹配
  • 范围查询评估:扫描范围是否可控
  • 核心语句巡检:捕捉档位劣化
  • 结构改造前评估:确认关键路径依赖哪个索引

查看用例

查看用例
EXPLAIN SELECT * FROM appdb.users WHERE email = 'a@b.com';   # 唯一索引等值,档位最好
EXPLAIN SELECT * FROM appdb.orders WHERE user_id = 1;   # 普通索引等值匹配,日常目标档位
EXPLAIN SELECT * FROM appdb.orders WHERE created_at >= '2026-10-01';   # 索引范围扫描
EXPLAIN SELECT * FROM appdb.orders WHERE status = 1;   # 条件列无索引时退化为全表扫描

档位与判读

档位含义判读要点
常量查找主键或唯一键等值命中单行最快,无需优化
唯一索引匹配连表时用唯一索引逐行对应连表查询的理想档位
普通索引等值匹配用普通索引定位一组行日常追求的档位
索引范围扫描按范围读取索引区间可接受,注意范围大小
全索引扫描遍历整个索引树偏慢,接近全表扫描
全表扫描逐行读取整张表重点治理对象
候选索引为空没有任何可用索引先补索引再看档位
全表扫描不一定是错误:小表上全扫往往比走索引更便宜,判断要结合估算行数与表规模,而不是一看到全表扫描就动手改造。
全索引扫描容易被误当成走索引就没问题:它遍历整个索引树,性能接近全表扫描,只是读取对象从表变成了索引。
只看档位不看扫描行数会漏掉真正的瓶颈:档位看着正常但估算行数巨大时,代价依然很高,两者必须一起判断。

档位优化清单

  • 先确认候选索引是否为空,为空就直接补索引
  • 确认复合索引的前缀是否与条件匹配
  • 确认条件列是否被函数或运算包住
  • 确认扫描行数的量级是否可接受
  • 小表全扫可以接受,不要为了档位强行加索引
  • 优化后重新查看计划,确认档位确实提升
档位是优化器基于统计信息的选择结果:数据分布变化后同一条语句可能落到不同档位,因此关键语句的访问类型要定期复核,而不是上线时看一次就归档。

易错点

  • 迷信必须走索引:几千行的小表走索引反而更慢,判断要结合表规模与估算行数
  • 把全索引扫描当成健康状态:它遍历整个索引树,性能接近全表扫描,仍需治理
  • 只看档位不看扫描行数:档位看着正常但行数巨大,真实代价依然很高
  • 为了提升档位盲目加索引:索引增多会拖慢写入并干扰优化器选择,加之前先确认收益
  • 范围扫描范围失控:条件写成大范围或被函数包住,索引退化接近全扫,需要收窄条件

数据来源与参考

  • MySQL 8.0 Reference Manual: EXPLAIN Join Types

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌