select_type
常见的值以及描述如下
| 值 | 描述 |
|---|---|
| SIMPLE | 简单的SELECT语句(不包括UNION操作或子查询操作) |
| PRIMARY | 查询中最外层的SELECT(如两表做UNION或者存在子查询的外层的表操作为PRIMARY,内层的操作为UNION) |
| UNION | UNION操作中,查询中处于内层的SELECT,即被union的SELECT |
| SUBQUERY | 子查询中的SELECT |
| DERIVED | 表示包含在 From 子句中的 Select 查询 |
| UNION RESULT | union的结果,此时id为NULL |
table
type(重要)
这列很重要,显示了连接使用哪种类型,有无使用索引, 常见的值从最好到最差如下 system > const > eq_ref > ref > range > index > all
各值的描述如下
| 值 | 描述 |
|---|---|
| system | 表只有一行,MyISAM引擎所有 |
| const | 常量连接,表最多只有一行匹配,通常用于主键或者唯一索引比较时,如: select * from t_user where id = 1; |
| eq_ref | 表关联查询时,对于前表的每一行,后表只有一行与之匹配。 (1) join查询 (2) 命中主键或者非空唯一索引 |
| ref | 只使用了索引的最左前缀或者使用的索引是非唯一索引、非主键索引 |
| range | between,in,>等都是典型的范围(range)查询 |
| index | 需要扫描索引上的全部数据,如: select count(*) from t_user; |
| all | 全表扫描 |
Extra(重要)
这一列也很重要,主要展示额外的信息说明,能够给出让我们深入理解执行计划进一步的细节信息
常见的值及描述如下
| 值 | 描述 |
|---|---|
| Using filesort | 当order by 无法利用索引完成排序时,优化器不得不选择合适的算法从内存或者磁盘进行排序 |
| Using temporary | 使用了临时表 |
| Using index | select后面的查询字段在索引中就可以取到,无需再回表了,即所谓的覆盖索引,这种查询性能很好 |
| Using index condition | mysql5.6之后引入了ICP(索引条件下推) |
| Using where | Mysql 服务器在存储引擎检索行后再进行过滤 |
