No tables used:当查询语句的没有FROM语句时将会提示该额外信息
Impossible WHERE:查询语句的 WHERE 语句永远为 FALSE 时将会提示该额外信息
No matching min/max row:查询列表处有MIN或者MAX聚集函数,但是并没有符合WHERE语句中的搜索条件的记录时,将会提示该额外信息
Using index:查询列表以及搜索条件中只包含属于某个索引的列,也就是在可以使用索引覆盖的情况下,在 Extra 列将会提示该额外信息
Using index condition:有些搜索条件中虽然出现了索引列,但却不能使用到索引(索引条件下推:减去好多回表操作的成本(Extra也一样会显示Using index condition))
Using where
当我们使用全表扫描来执行对某个表的查询,并且该语句的WHERE语句中有针对该表的搜索条件时,在 Extra 列中会提示上述额外信息
当使用索引访问来执行对某个表的查询,并且该语句的WHERE语句中有除了该索引包含的列之外的其他搜索条件时,在 Extra 列中也会提示上述额外信息
Using join buffer (Block Nested Loop)
在连接查询执行过程中,当被驱动表不能有效的利用索引加快访问速度,MySQL一般会为其分配一块名叫 join buffer 的内存块来加快查询速度,也就是我们所讲的基于块的嵌套循环算法
Not exists:当我们使用左/右(外)连接时,如果WHERE语句中包含要求被驱动表的某个列等于NULL值的搜索条件,并且那个列又是不允许存储 NULL 值的,那么在该表的执行计划的 Extra 列就会提示 Not exists 额外信息
Using intersect(...):准备使用Intersect索引合并的方式执行查询,括号中的...表示需要进行索引合并的索引名称
Using union(...):准备使用Union索引合并的方式执行查询
Using sort_union(...):说明准备使用Sort-Union索引合并的方式执行查询
Zero limit:LIMIT语句的参数为 0 时,表示压根儿不打算从表中读出任何记录,将会提示该额外信息
Using filesort:有些排序操作无法使用到索引,只能在内存中(记录较少的时候)或者磁盘中(记录较多的时候)进行排序,就会在执行计划的 Extra 列中显示 Using filesort提示;(需要使用filesort的记录很多时,过程是很耗费性能的)
Using temporary:在许多查询的执行过程中,MySQL可能会借助临时表来完成一些功能,比如去重、排序之类的,比如我们在执行许多包含DISTINCT、GROUP BY、UNION等语句的查询过程中,如果不能有效利用索引来完成查询,MySQL很有可能寻求通过建立内部的临时表来执行查询。如果查询中使用到了内部的临时表,在执行计划的 Extra 列将会显示 Using temporary 提示
Start temporary, End temporary:查询优化器会优先尝试将 IN 子查询转换成 semijoin ,而 semi-join 会有好多种执行策略,当执行策略为DuplicateWeedout时,也就是通过建立临时表来实现为外层查询中的记录进行去重操作时,驱动表查询执行计划的 Extra 列将显示 Start temporary 提示,被驱动表查询执行计划的 Extra列将显示 End temporary 提示
LooseScan:在将In子查询转为semi-join时,如果采用的是LooseScan执行策略,则在驱动表执行计划的Extra列就是显示LooseScan提示
FirstMatch(tbl_name):在将In子查询转为semi-join时,如果采用的是FirstMatch执行策略,则在被驱动表执行计划的Extra列就是显示FirstMatch(tbl_name) 提示