在 MySQL 中,EXPLAIN
语句用于分析 SQL 查询的执行计划。EXPLAIN
输出的结果中包含多个字段,其中 type
和 ref
字段是理解查询执行方式的重要部分。
type 字段
type
字段表示 MySQL 在查询过程中使用的访问类型,反映了查询的效率。访问类型从最优到最差的顺序如下:
- system:表仅有一行(等同于系统表)。这是访问类型中最优的情况。
- const:表最多有一个匹配行(使用主键或唯一索引)。在查询开始时优化器能将其转换为常量。
- eq_ref:对于每个来自前一张表的行组合,最多匹配一行。这通常用于主键或唯一索引扫描。
- ref:对于每个来自前一张表的行组合,匹配多行。这通常用于非唯一索引或非主键索引扫描。
- range:只检索给定范围的行,使用索引来选择行。这通常用于范围条件查询(如BETWEEN、>、< 等)。
- index:全索引扫描,类似于全表扫描,但遍历的是索引树。这通常比全表扫描快,因为索引文件通常比数据文件小。
- ALL:全表扫描。这是访问类型中最差的情况。
ref 字段
ref
字段显示的是查询执行过程中使用的索引条件。它提供了有关查询如何利用索引来查找行的信息。ref
字段的值可以是以下几种类型:
- const:表示使用常量值进行索引查找。
-
NULL:表示没有使用索引条件,通常出现在
ALL
或index
类型的扫描中。 - 列名:表示使用某个列的值进行索引查找。
- 函数:表示使用某个函数的结果进行索引查找。
type 和 ref 的对应关系
1. system
-
ref:通常为
NULL
,因为只有一行数据。
2. const
-
ref:通常为
const
,表示使用常量值进行索引查找。
3. eq_ref
- ref:通常为列名,表示使用某个列的值进行索引查找。例如,主键或唯一索引。
4. ref
- ref:通常为列名,表示使用某个列的值进行索引查找。例如,非唯一索引或非主键索引。
5. range
- ref:通常为列名,表示使用某个列的值进行范围查找。
6. index
-
ref:通常为
NULL
,因为这是全索引扫描。
7. ALL
-
ref:通常为
NULL
,因为这是全表扫描。
结论
EXPLAIN
语句中的 type
和 ref
字段是理解查询执行计划的重要部分:
-
type 字段表示 MySQL 在查询过程中使用的访问类型,从最优到最差的顺序为:
system
、const
、eq_ref
、ref
、range
、index
、ALL
。 -
ref 字段显示查询执行过程中使用的索引条件,可能的值包括:
const
、NULL
、列名和函数结果。
通过分析 type
和 ref
字段的值,可以了解查询是如何利用索引进行优化的,从而帮助开发者进行查询优化,提高数据库的响应速度。