system > const > eq_ref > ref > range > index > ALL
一、总览理解(先记住)
| type | 性能 | 含义 |
|---|---|---|
| system | 最优 | 表只有1行 |
| const | 极优 | 主键唯一查询 |
| eq_ref | 很好 | join 唯一索引匹配 |
| ref | 好 | 普通索引等值查询 |
| range | 中等 | 范围扫描 |
| index | 较差 | 扫描整个索引 |
| ALL | 最差 | 全表扫描 |
二、逐个解释(面试标准答案)
1. system(最好)
含义:
表只有一行数据(系统表或极小表)。
select * from config;
如果表只有一条记录。
特点:
- 几乎瞬间完成
- 极少见
2. const(非常好)
含义:
通过 主键 / 唯一索引 一次就找到一条记录。
select * from user where id = 1;
id 是主键。
特点:
- 只匹配一行
- 最常见高效查询
3. eq_ref(join 最优)
含义:
多表关联时,使用主键或唯一索引,每次关联只返回一条记录。
select *
from order o
join user u on o.user_id = u.id;
u.id 是主键。
特点:
- join 性能很好
- 一对一关联
4. ref(常见且不错)
含义:
使用普通索引做等值查询,可能匹配多行。
select * from user where name='Tom';
name 有普通索引。
特点:
- 常见业务查询
- 比 const 稍差(可能多行)
5. range(范围扫描)
含义:
索引范围查询。
select * from user where age > 18;
或:
where id between 1 and 100
where name like 'Tom%'
where id in (1,2,3)
特点:
- 走索引
- 扫描一段范围,不是一条
6. index(全索引扫描)
含义:
扫描整个索引树,而不是扫数据表。
select name from user;
name 有索引,优化器选择扫索引。
特点:
- 比 ALL 好(索引通常比数据行小)
- 但仍然扫描全部索引记录
7. ALL(最差)
含义:
全表扫描。
select * from user where phone='138';
phone 没索引。
特点:
- 从头到尾扫整张表
- 大表非常慢
三、面试官最爱追问:为什么 index 比 ALL 好?
index
扫描的是:
索引页
更小、更有序。
ALL
扫描的是:
整行数据页
更大、更慢。
四、如何记忆(推荐)
system const = 一条记录秒查
eq_ref ref = 索引关联/等值查询
range = 范围查
index = 扫全部索引
ALL = 扫整张表