执行计划中的 `type` 字段有哪些常见的取值?分别是什么含义?

推荐答案

在 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 NULLIS 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 类型。
纠错
反馈