type 字段是 MySQL EXPLAIN 输出中最重要的指标之一,它显示了查询使用了何种类型的连接。性能从好到差的排序通常为:system > const > eq_ref > ref > range > index > ALL。
system
- 表只有一行记录(系统表)。这是
const连接类型的特例。
- 表只有一行记录(系统表)。这是
const
- 表中至多有一个匹配行。
- 通常出现在使用
PRIMARY KEY或UNIQUE索引与常量值进行比较时。
eq_ref
- 对于来自前一张表的每一行组合,从该表中读取一行。
- 除了
system和const之外,这是最好的连接类型。通常出现在连接使用主键或唯一索引时。
ref
- 使用了索引,但该索引不是
PRIMARY KEY或UNIQUE索引。 - 即对于前一张表的每一行组合,可能会匹配多行数据。
- 使用了索引,但该索引不是
fulltext
- 使用
FULLTEXT索引执行连接。
- 使用
ref_or_null
- 类似于
ref,但 MySQL 会对包含NULL值的行进行额外的搜索。
- 类似于
range
- 只检索给定范围内的行,使用索引来选择行(例如使用 between, <, >, in 等)。
index
- 与
ALL类似,区别在于扫描的是索引树(Index Tree)。通常通过以下两种方式发生:- 覆盖索引(Covering Index):查询所需的字段都在索引中,因此只需扫描索引树,不需要回表查询数据文件。
- 全索引扫描:使用索引顺序执行全表扫描来查找数据行。
- 与
ALL
- 全表扫描(Full Table Scan)。这是性能最差的情况,通常需要优化。