id相同的情况,执行顺序由上至下,那么就是先加载t1,然后加载t3,最后加载t2。
id不同的情况,id值越大的越先被执行,先加载子查询t3表,再执行t1表,最后加载t2表。
id相同的可以认为是一组,顺序由上至下执行,针对此例先加载t3表,然后加载derived2表,derived为衍生的意思,后面的2指的是id为2的子查询(括号中的虚表),
简单的select查询,不包含子查询、union等。
查询中若含有子查询,则最外一层标记为primary,见1.1、1.2例子
在select或者where中包含子查询。
在from中包含子查询被标记为derived,MySQL会递归查询,把结果放在临时表中。
若第二个select出现在union之后,则被标记为union;若union包含在from子句的子查询中,外层select则被标记为derived。
从union中获取结果的select
这个不用过多解释,就是表示是哪张表。
包含了以上8种类型,这8种类型顺序system>const>eq_ref>ref>range>index>all,一般来说至少要达到range级别,最差也要达到index。
一般为MySQL系统表,开发中实际用不到。
表示通过一次索引就找到了,一般用于primary key或者unique索引,因为只匹配一行数据,所以很快,如果将主键置于where列表中,MySQL就能将其转化成一个常量。
唯一性索引扫描,表中只有一条数据与之匹配,常见于主键或者唯一索引扫描。
非唯一索引扫描,返回匹配值的所有行。
检索给定的范围行,一般用于where中的between、<、>、in等查询。
只遍历索引树,索引文件通常比数据文件小,all是从硬盘读。例:select id from t1;
全表扫描。例 select * from t1;
可能用到的索引,一个或者多个,不一定实际使用到。
实际使用到的索引,如果为null,则没有用到索引。
覆盖索引,如果select后面的字段刚好和建立索引的字段个数、顺序都能对应上,则使用索引,例:
表示索引中使用的字节数,在不损失精度的前提下,长度越短越好。
显示索引的哪一列被使用了,例:
t1表的col1匹配t2表的col1,col2匹配了一个常量,即‘ac’。
根据表统计信息及索引选用情况,大致估算出找到所需的记录所需要读取的行数,例:
先加载t1表的640行记录,然后与t2表进行匹配,有一条记录匹配,前面的type字段为eq_ref。
不适合在其他列展示,但是比较重要的信息。
对比下图,我们发现,上图多了一个using filesort信息,原因是因为我们建的索引为idx_col1_col2_col3,但是sql语句中的查询条件,where col1 = ‘ac’,order by col3,中间断了一层col2,MySQL用了文件内排序重新执行了一遍sql,而下图col1、col2、col3都用上了,没有断,就没有文件内排序,这种情况我们要注意,尽量不要发生using filesort。
使用了临时表保存结果,常见于order by 和 group by。例:
建立的索引为col1和col2组合索引,但是group by的是单独col2,MySQL会内部产生一个临时表去进行分组,非常耗费资源,所以我们group的时候要根据索引的个数和顺序来。
覆盖索引,直接从索引文件读取数据,没有回表查询数据,速度最快。