被驱动表
是通过主键
或者唯一二级索引
列等值
匹配的方式进行访问的(如果该主键或者唯一二级索引是联合索引的话,所有的索引列都必须进行等值比较),则对该被驱动表
的访问方法就是eq_ref普通的二级索引列
与常量进行等值匹配时来查询某个表,那么对该表的访问方法就可能是 ref被驱动表
的eq_ref访问方法,unique_subquery是针对在某些包含IN子查询
的查询语句中,如果查询优化器决定将IN子查询转换为EXISTS子查询
,并且子查询可以使用到主键
进行等值匹配的话,那么该子查询执行计划的 type 列的值就是 unique_subquery普通的索引
范围区间
的记录,那么就可能使用到range访问方法索引覆盖
,但需要扫描全部的索引记录
时,该表的访问方法就是index如果使用的是全表扫描的方式执行的单表查询,那么计算驱动表扇出时需要估计出满足搜索条件的记录到底有多少条
如果使用的是索引执行的单表扫描,那么计算驱动表扇出的时候需要估计出满足除使用到对应索引的搜索条件外的其他搜索条件的记录有多少条
被驱动表
不能有效的利用索引加快访问速度,MySQL一般会为其分配一块名叫 join buffer 的内存块来加快查询速度,也就是我们所讲的基于块的嵌套循环算法左/右(外)连接
时,如果WHERE语句中包含要求被驱动表的某个列等于NULL值的搜索条件,并且那个列又是不允许存储 NULL 值的,那么在该表的执行计划的 Extra 列就会提示 Not exists 额外信息临时表
来完成一些功能,比如去重、排序之类的,比如我们在执行许多包含DISTINCT、GROUP BY、UNION等语句的查询过程中,如果不能有效利用索引来完成查询,MySQL很有可能寻求通过建立内部的临时表来执行查询。如果查询中使用到了内部的临时表,在执行计划的 Extra 列将会显示 Using temporary 提示GROUP BY子句的查询中默认添加上ORDER BY子句,不想为包含 GROUP BY子句的查询进行排序,需要我们显式的写上ORDER BY NULL 在 EXPLAIN 单词和真正的查询语句中间加上 FORMAT=JSON,可以格式化为Json