NULL
: MySQL在优化过程中分解语句,执行时甚至不用访问表或索引,例如从一个索引列里选取最小值可以通过单独索引查找完成。
system
:表仅有一行(=系统表)。这是const联接类型的一个特例。当MySQL对查询某部分进行优化,并转换为一个常量时,使用这些类型( system/const )访问。如将主键置于where列表中,MySQL就能将该查询转换为一个常量。当查询的表只有一行的情况下,使用system。
const
:表最多有一个匹配行,它将在查询开始时被读取。因为仅有一行,在这行的列值可被优化器剩余部分认为是常数。const表很快,因为它们只读取一次!
eq_ref
:类似ref,区别就在使用的索引是唯一索引,对于每个索引键值,表中只有一条记录匹配,简单来说,就是多表连接中使用primary key或者 unique key作为关联条件。这可能是最好的联接类型,除了const类型。
ref
:表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值。
ref_or_null
:该联接类型如同ref,但是添加了MySQL可以专门搜索包含NULL值的行。
index_merge
:该联接类型表示使用了索引合并优化方法。【不常用】
unique_subquery
:该类型替换了下面形式的IN子查询的 ref:value IN (SELECT primary_key FROM single_table WHERE some_expr) unique_subquery是一个索引查找函数,可以完全替换子查询,效率更高。【不常用】
index_subquery
:该联接类型类似于unique_subquery。可以替换IN子查询,但只适合下列形式的子查询中的非唯一索引:value IN (SELECT key_column FROM single_table WHERE some_expr)。【不常用】
range
:只检索给定范围的行,使用一个索引来选择行。
index
:该联接类型与ALL相同,Full Index Scan,index与ALL区别为index类型只遍历索引树。这通常比ALL快,因为索引文件通常比数据文件小。
ALL
:Full Table Scan, MySQL将遍历全表以找到匹配的行。
Distinct
:MySQL发现第1个匹配行后,停止为当前的行组合搜索更多的行。
Not exists
:MySQL能够对查询进行LEFT JOIN优化,发现1个匹配LEFT JOIN标准的行后,不再为前面的的行组合在该表内检查更多的行。
range checked for each record
(index map: #):MySQL没有发现好的可以使用的索引,但发现如果来自前面的表的列值已知,可能部分索引可以使用。
Using filesort
:当Query中包含 order by 操作,而且无法利用索引完成的排序操作称为“文件排序”。
Using index
:只使用索引树中的信息而不需要进一步搜索读取实际的行来检索表中的列信息。
Using temporary
:为了解决查询,MySQL需要创建一个临时表来容纳结果集,常见于排序和分组查询,常见 group by、order by。
Using where
:不用读取表中所有信息,仅通过索引就可以获取所需数据,这发生在对表的全部的请求列都是同一个索引的部分的时候,表示mysql服务器将在存储引擎检索行后再进行过滤。
Using sort_union(…)、Using union(…)、Using intersect(…)
:这些函数说明如何为index_merge联接类型合并索引扫描。
Using index for group-by
:类似于访问表的Using index方式,Using index for group-by表示MySQL发现了一个索引,可以用来查询GROUP BY或DISTINCT查询的所有列,而不要额外搜索硬盘访问实际的表。
Using join buffer
:改值强调了在获取连接条件时没有使用索引,并且需要连接缓冲区来存储中间结果。如果出现了这个值,那应该注意,根据查询的具体情况可能需要添加索引来改进能。
Impossible where
:这个值强调了where语句会导致没有符合条件的行(通过收集统计信息不可能存在结果)。
Select tables optimized away
:这个值意味着仅通过使用索引,优化器可能仅从聚合函数结果中返回一行。
No tables used
:Query语句中使用from dual 或不含任何from子句。