这是一个 explain 学习笔记系列,目的时帮助大家看懂 explain 各个输出项的作用和意义,从而可以针对性地提升查询语句的性能。
列描述
| name | Desc |
|---|---|
| id | 每一个 select 对应一个 id |
| select_type | 对应的查询类型 |
| table | table 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 ,也就知道了单查询在整个大查询中的执行角色。下面看看有哪些值:
| name | desc |
|---|---|
| simple | 单表查询时就是这个 |
| primary | union[all],子查询 其中最左边的值就是 primary |
| union | union[all] 中除了最左边的查询,其余的小查询都是 union |
| union result | union 中最后使用临时表完成 union 的去重工作 |
| subquery | 子查询不能转换为半连接,且同时为不相关子查询 -> 优化器优化子查询物化【物化:将子查询结果集保存到临时表的过程】 |
| dependent subquery | 子查询不能转换为半连接 -> 优化器优化为相关子查询 |
| dependent union | union[all] 大查询中,各个子查询都依赖外层查询。除最左边的小查询外,其余小查询都是 dependent union |
| derived | 包含派生表查询中,如果是以物化派生表方式查询,则派生表对应的子查询为 derived |
| materialized | 子查询被优化器优化为物化方式 |