怎么看执行计划(explain),如何理解其中各个字段的含义?

怎么看执行计划(explain),如何理解其中各个字段的含义?
explain 是 sql 优化的利器,除了优化慢 sql,平时的 sql 编写,也应该先 explain,查看一下执行计划,看看是否还有优化的空间。
直接在 select 语句之前增加explain
关键字,就会返回执行计划的信息。
- id 列:每个 SELECT 语句在执行计划中被分配的唯一标识符。
- select_type 列:表示查询的类型,根据关联、联合、子查询等进行分类。常见的查询类型包括 SIMPLE(简单查询)、PRIMARY(主查询)等。
- table 列:表示当前执行计划所涉及的表。
- type 列:是最重要的列之一,表示查询过程中使用的访问方法,即 MySQL 如何查找表中的行。
性能从最优到最差的顺序是:system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL
- system
system
:当表只包含一行记录(系统表)时,数据量很少,通常无需进行磁盘 IO,速度非常快。
- const
const
:表示查询命中了 primary key
主键或 unique
唯一索引,或者被连接的部分是一个常量(const
)值。这种扫描效率极高,返回的数据量较少,速度非常快。
- eq_ref
eq_ref
:查询命中了主键 primary key
或 unique key
索引,type
值为 eq_ref
。
- ref_or_null
ref_or_null
:类似于 ref
,区别在于 MySQL 还额外搜索包含 NULL
值的行。
- index_merge
index_merge
:使用索引合并优化方法,查询使用了两个或更多个索引。
- unique_subquery
unique_subquery
:替换下面的 IN
子查询,子查询返回不重复的集合。
- index_subquery
index_subquery
:类似于 unique_subquery
,但用于非唯一索引,可以返回重复值。
- range
range
:使用索引选择行,仅检索给定范围内的行。简单来说,针对具有索引的字段,通过给定的范围查询数据,type
值为 range
。在 WHERE
语句中使用 BETWEEN...AND
、<
、>
、<=
、IN
等条件查询时,type
值通常为 range
。
- index
index
:Index
和 ALL
都是读取全表,不同之处在于 index
是通过遍历索引树来读取,而 ALL
是从磁盘读取。
- ALL
表示全表扫描,需要遍历整个表。
- possible_keys 列:显示查询可能使用哪些索引来查找,对于优化 SQL 查询时非常重要。
- key 列:显示 MySQL 实际使用的索引来优化对该表的访问,可以判断索引是否生效。
- key_len 列:显示 MySQL 使用的索引长度。
- ref 列:
ref
列显示与索引列进行等值匹配的值,常见的值包括:const(常量)、func、NULL、字段名。 - rows 列:这是一个重要的字段,MySQL 查询优化器根据统计信息估计 SQL 查询需要扫描读取的数据行数,这个值直观地反映了 SQL 的效率,原则上行数越少越好。
- Extra 列:显示不适合在其他列中显示的额外信息,虽然称为“额外”,但其中包含一些重要的信息:
- Using index:表示 MySQL 将使用覆盖索引,避免回表操作。
- Using where:表示存储引擎在检索数据之后进行过滤操作。
- Using temporary:表示在查询结果排序时将使用临时表。