推荐答案
在 MySQL 的执行计划中,type
字段表示表的访问方式,常见的取值及其含义如下:
- system:表只有一行记录(等同于系统表),这是
const
类型的特例。 - const:表最多有一个匹配行,通常是通过主键或唯一索引访问。
- eq_ref:对于每个来自前表的行组合,从该表中读取一行。通常是通过主键或唯一索引进行关联。
- ref:对于每个来自前表的行组合,从该表中读取所有匹配的行。通常是通过非唯一索引进行关联。
- fulltext:使用全文索引进行查询。
- ref_or_null:类似于
ref
,但包含对 NULL 值的额外搜索。 - index_merge:使用了索引合并优化,即使用了多个索引的组合。
- unique_subquery:在子查询中使用了唯一索引。
- index_subquery:在子查询中使用了非唯一索引。
- range:只检索给定范围内的行,通常是在索引列上使用范围条件。
- index:全索引扫描,扫描整个索引树。
- ALL:全表扫描,扫描整个表。
本题详细解读
system
- 含义:表只有一行记录,通常是系统表或派生表。
- 场景:当表只有一行数据时,MySQL 会将其视为
system
类型。
const
- 含义:表最多有一个匹配行,通常是通过主键或唯一索引访问。
- 场景:当查询条件中包含主键或唯一索引的等值条件时,MySQL 会使用
const
类型。
eq_ref
- 含义:对于每个来自前表的行组合,从该表中读取一行。通常是通过主键或唯一索引进行关联。
- 场景:在连接查询中,当使用主键或唯一索引进行关联时,MySQL 会使用
eq_ref
类型。
ref
- 含义:对于每个来自前表的行组合,从该表中读取所有匹配的行。通常是通过非唯一索引进行关联。
- 场景:在连接查询中,当使用非唯一索引进行关联时,MySQL 会使用
ref
类型。
fulltext
- 含义:使用全文索引进行查询。
- 场景:当查询条件中包含全文索引时,MySQL 会使用
fulltext
类型。
ref_or_null
- 含义:类似于
ref
,但包含对 NULL 值的额外搜索。 - 场景:当查询条件中包含
IS NULL
或IS NOT NULL
时,MySQL 会使用ref_or_null
类型。
index_merge
- 含义:使用了索引合并优化,即使用了多个索引的组合。
- 场景:当查询条件中包含多个索引列时,MySQL 可能会使用
index_merge
类型。
unique_subquery
- 含义:在子查询中使用了唯一索引。
- 场景:当子查询中使用唯一索引时,MySQL 会使用
unique_subquery
类型。
index_subquery
- 含义:在子查询中使用了非唯一索引。
- 场景:当子查询中使用非唯一索引时,MySQL 会使用
index_subquery
类型。
range
- 含义:只检索给定范围内的行,通常是在索引列上使用范围条件。
- 场景:当查询条件中包含范围条件(如
BETWEEN
、>
、<
等)时,MySQL 会使用range
类型。
index
- 含义:全索引扫描,扫描整个索引树。
- 场景:当查询条件中只涉及索引列时,MySQL 可能会使用
index
类型。
ALL
- 含义:全表扫描,扫描整个表。
- 场景:当查询条件中不涉及索引列时,MySQL 会使用
ALL
类型。