explain 学习笔记(一)| 七日打卡

141 阅读2分钟

这是一个 explain 学习笔记系列,目的时帮助大家看懂 explain 各个输出项的作用和意义,从而可以针对性地提升查询语句的性能。

列描述

nameDesc
id每一个 select 对应一个 id
select_type对应的查询类型
tabletable name
partitions匹配的分区信息
type单表的访问方式
possible_keys可能用的 index
key实际使用的 index
key_len实际使用的 index len
ref使用 index 进行等值查询时,对应的对象信息
rows预计需要扫描的行数
filtered根据 rows,经过搜索条件过滤后剩余记录条数的百分比
extra额外信息

列详解

大致说明一下各个列的含义和出现场景。

id

一个复杂的 SQL 也是有多个简单的单表查询组成,最终执行计划显示的也是对多个单表的查询。而查询语句一般都以 select 作为开头,每一个 select 中的 from 可以包含若干表,每一张表都对应执行计划中的一条记录,那在执行计划中是怎么显示?

  • 子查询涉及多个 select 时,每一个 select 对应一个 id
    • 如果涉及查询优化器将 子查询 -> 半连接 ,从而转换为 Join
  • join 一般会涉及两个表以上,每一个表会涉及一条记录,但是一个 join 对应的记录的 ID 都是一样的;
  • union 除了相关的两个子查询,还涉及到临时表合并。所以一般有 3 条记录:
    • Primary:主要查询
    • Union:第二个查询
    • Union Select:内部临时表进行去重

select_type

知道每一个查询的 select_type ,也就知道了单查询在整个大查询中的执行角色。下面看看有哪些值:

namedesc
simple单表查询时就是这个
primaryunion[all],子查询 其中最左边的值就是 primary
unionunion[all] 中除了最左边的查询,其余的小查询都是 union
union resultunion 中最后使用临时表完成 union 的去重工作
subquery子查询不能转换为半连接,且同时为不相关子查询 -> 优化器优化子查询物化【物化:将子查询结果集保存到临时表的过程】
dependent subquery子查询不能转换为半连接 -> 优化器优化为相关子查询
dependent unionunion[all] 大查询中,各个子查询都依赖外层查询。除最左边的小查询外,其余小查询都是 dependent union
derived包含派生表查询中,如果是以物化派生表方式查询,则派生表对应的子查询为 derived
materialized子查询被优化器优化为物化方式