MySQL 中 EXPLAIN 命令用于展示 SQL 查询的执行计划,其中 type 字段是非常关键的一个列,它表示 MySQL 在执行查询时如何查找和访问表中的行。以下是 type 字段可能出现的值及其含义,从最优到最劣排列:

  1. system: 这通常表示MySQL能够直接通过内部系统表获取结果,不需要进行任何表扫描。这种类型极其高效,但在现代MySQL版本中可能不再使用此标识,而是统一用其他类型来表示。
  2. const: 当MySQL能通过主键或唯一索引,通过常量值直接定位到一行数据时,使用此类型。查询性能极高,且只会返回一行数据。
  3. eq_ref: 类似于const,但应用于多表连接的情况,每行只匹配一个记录。常出现在关联条件是主键或唯一非空索引的情况下。
  4. ref: 使用非唯一索引进行查找,返回匹配某个值的一组行。这可能是通过索引子集完成的。
  5. fulltext: 对于全文索引检索而言的特殊类型,表示使用全文索引进行查询。
  6. ref_or_null: 类似于ref,但包括NULL值的检索。
  7. range: 使用索引范围扫描,查询中有WHERE子句限制了索引列的范围。
  8. index: 全索引扫描,MySQL仅扫描索引树而不扫描数据行,适用于查询的所有列都在同一个索引中且没有排序或分组操作的情况。
  9. index_merge: 使用了两个或更多索引,然后合并结果集。
  10. unique_subquery: IN子查询中,子查询返回单个值并且结果是唯一确定的。
  11. index_subquery: IN子查询中,子查询使用了索引,但不一定是唯一索引。
  12. ALL: 最差的情况,表示MySQL必须对全表进行逐行扫描以找到匹配行。

注意,type字段的实际表现会受到查询条件、索引状况、表结构等多种因素的影响。当优化查询时,目标通常是尽可能让type接近consteq_ref或至少是range,避免全表扫描(ALL)。在不同版本的MySQL中,部分类型的名称或解释可能会有所变化或新增类型。