SQL执行计划的输出可能为多行,每一行表明对一个数据库对象的操做sql
能够看到上面的执行计划返回了3行结果,id列的值能够看做是SQL中所具备的SELECT操做的序号
因为上述SQL中只有一个SELECT,因此id全为1,所以,咱们就要按照由上至下读取执行计划
按照咱们的SQL语句,咱们会认为执行顺序是a,b,c,可是经过上图能够发现,Mysql并非完成按照SQL中所写的顺序来进行表的关联操做的
执行对表的执行顺序为a,c,b,这是因为MySQL优化器会根据表中的索引的统计信息来调整表关联的实际顺序数据库
值 | 含义 |
---|---|
SIMPLE | 不包含子查询或是UNION操做的查询 |
PRIMARY | 查询中若是包含任何子查询,那么最外层的查询则被标记为PRIMARY |
SUBQUERY | SELECT 列表中的子查询 |
DEPENDENT SUBQUERY | 依赖外部结果的子查询 |
UNION | Union操做的第二个或是以后的查询的值为union |
DEPENDENT UNION | 当UNION做为子查询时,第二或是第二个后的查询的select_type值 |
UNION RESULT | UNION产生的结果集 |
DERIVED | 出如今FROM子句中的子查询 |
包含如下几种结果:服务器
输出去数据行所在表的名称,若是表取了别名,则显示的是别名 <union M,N>: 由ID为M,N查询union产生的结果集 <derived N>/<subquery N> :由ID为N的查询产生的结果
查询匹配的记录来自哪个分区 对于分区表,显示查询的分区ID 对于非分区表,显示为NULL
按性能从高至低排列以下:函数
值 | 含义 |
---|---|
system | 这是const联接类型的一个特例,当查询的表只有一行时使用 |
const | 表中有且只有一个匹配的行时使用,如对主键或是惟一索引的查询,这是效率最高的联接方式 |
eq_ref | 惟一索引或主键索引查询,对应每一个索引键,表中只有一条记录与之匹配 |
ref | 非惟一索引查找,返回匹配某个单独值的全部行 |
ref_or_null | 相似于ref类型的查询,可是附加了对NULL值列的查询 |
index_merge | 该联接类型表示使用了索引合并优化方法 |
range | 索引范围扫描,常见于between、>、<这样的查询条件 |
index | FULL index Scan 全索引扫描,同ALL的区别是,遍历的是索引树 |
ALL | FULL TABLE Scan 全表扫描,这是效率最差的联接方式 |
包含MySQL如何执行查询的附加信息性能
值 | 含义 |
---|---|
Distinct | 优化distinct操做,在找到第一个匹配的元素后即中止查找 |
Not exists | 使用not exists来优化查询 |
Using filesort | 使用额外操做进行排序,一般会出如今order by或group by查询中 |
Using index | 使用了覆盖索引进行查询 |
Using temporary | MySQL须要使用临时表来处理查询,常见于排序,子查询,和分组查询 |
Using where | 须要在MySQL服务器层使用WHERE条件来过滤数据 |
select tables optimized away | 直接经过索引来得到数据,不用访问表,这种状况一般效率是最高的 |
显示MySQL索引所使用的字节数,在联合索引中若是有3列,假如3列字段总长度为100个字节,Key_len显示的可能会小于100字节,好比30字节,这就说明在查询过程当中没有使用到联合索引的全部列,只是利用到了前面的一列或2列优化