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

explain 是 sql 优化的利器,除了优化慢 sql,平时的 sql 编写,也应该先 explain,查看一下执行计划,看看是否还有优化的空间。

直接在 select 语句之前增加explain 关键字,就会返回执行计划的信息。

mysql-77711553-bb7b-4580-968a-4a973e3a31ca.png

  1. id 列:每个 SELECT 语句在执行计划中被分配的唯一标识符。
  2. select_type 列:表示查询的类型,根据关联、联合、子查询等进行分类。常见的查询类型包括 SIMPLE(简单查询)、PRIMARY(主查询)等。
  3. table 列:表示当前执行计划所涉及的表。
  4. 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 keyunique 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

indexIndexALL 都是读取全表,不同之处在于 index 是通过遍历索引树来读取,而 ALL 是从磁盘读取。

  • ALL

表示全表扫描,需要遍历整个表。

  1. possible_keys 列:显示查询可能使用哪些索引来查找,对于优化 SQL 查询时非常重要。
  2. key 列:显示 MySQL 实际使用的索引来优化对该表的访问,可以判断索引是否生效。
  3. key_len 列:显示 MySQL 使用的索引长度。
  4. ref 列:ref 列显示与索引列进行等值匹配的值,常见的值包括:const(常量)、func、NULL、字段名。
  5. rows 列:这是一个重要的字段,MySQL 查询优化器根据统计信息估计 SQL 查询需要扫描读取的数据行数,这个值直观地反映了 SQL 的效率,原则上行数越少越好。
  6. Extra 列:显示不适合在其他列中显示的额外信息,虽然称为“额外”,但其中包含一些重要的信息:
  • Using index:表示 MySQL 将使用覆盖索引,避免回表操作。
  • Using where:表示存储引擎在检索数据之后进行过滤操作。
  • Using temporary:表示在查询结果排序时将使用临时表。

标签: java, Java面试题, MySQL, Java问题合集, MySQL面试题, Java编程, Java问题精选, Java常见问题