select_type |
SELECT类型,可以为以下任何一种: |
* |
SIMPLE:简单SELECT,表示此查询不包含 UNION 查询或子查询 |
* |
PRIMARY:最外面的SELECT |
* |
UNION:UNION中的第二个或后面的SELECT语句 |
* |
DEPENDENT UNION:UNION中的第二个或后面的SELECT语句,取决于外面的查询 |
* |
UNION RESULT:UNION 的结果 |
* |
SUBQUERY:子查询中的第一个SELECT |
* |
DEPENDENT SUBQUERY:子查询中的第一个SELECT,取决于外面的查询 |
* |
DERIVED:导出表的SELECT(FROM子句的子查询) |
table |
输出的行所引用的表 |
type |
联接类型,type 字段比较重要, 它提供了判断查询是否高效的重要依据依据. 通过 type 字段, 我们判断此次查询是 全表扫描 还是 索引扫描 等。下面给出各种联接类型,按照从最佳类型到最坏类型进行排序: |
* |
system:表中只有一条数据. 这个类型是特殊的 const 类型 |
* |
const:针对主键或唯一索引的等值查询扫描, 最多只返回一行数据. const 查询速度非常快, 因为它仅仅读取一次即可 |
* |
eq_ref:此类型通常出现在多表的 join 查询, 表示对于前表的每一个结果, 都只能匹配到后表的一行结果, 查询效率较高 |
* |
ref:此类型通常出现在多表的 join 查询, 针对于非唯一或非主键索引, 或者是使用了 最左前缀 规则索引的查询 |
* |
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:只检索给定范围的行,使用一个索引来选择行。表示使用索引范围查询, 通过索引字段范围获取表中部分数据记录. 这个类型通常出现在 =, <>, >, >=, <, <=, IS NULL, <=>, BETWEEN, IN() 操作中 |
* |
index:表示全索引扫描(full index scan), 和 ALL 类型类似, 只不过 ALL 类型是全表扫描, 而 index 类型则仅仅扫描所有的索引, 而不扫描数据,因为索引文件通常比数据文件小 |
* |
ALL:表示全表扫描 |
possible_keys |
指出MySQL可能使用哪个索引在该表中找到行 |
key |
key 显示MySQL实际决定使用的索引。如果没有选择索引,键是NULL。 |
key_len |
key_len 显示MySQL决定使用的键长度。如果键是NULL,则长度为NULL。 |
ref |
ref 显示使用哪个列或常数与key一起从表中选择行。 |
rows |
rows 显示MySQL认为它执行查询时必须检查的行数。多行之间的数据相乘可以估算要处理的行数。 |
filtered |
filtered 显示了通过条件过滤出的行数的百分比估计值。 |
Extra |
该列包含MySQL解决查询的详细信息 |
* |
Distinct:MySQL发现第1个匹配行后,停止为当前的行组合搜索更多的行。 |
* |
Not exists:MySQL能够对查询进行LEFT JOIN优化,发现1个匹配LEFT JOIN标准的行后,不再为前面的的行组合在该表内检查更多的行。 |
* |
range checked for each record (index map: #):MySQL没有发现好的可以使用的索引,但发现如果来自前面的表的列值已知,可能部分索引可以使用。 |
* |
Using filesort:当 Extra 中有 Using filesort 时, 表示 MySQL 需额外的排序操作, 不能通过索引顺序达到排序效果. 一般有 Using filesort, 都建议优化去掉, 因为这样的查询 CPU 资源消耗大 |
* |
Using index:从只使用索引树中的信息而不需要进一步搜索读取实际的行来检索表中的列信息。即覆盖索引扫描, 表示查询在索引树中就可查找所需数据, 不用扫描表数据文件, 往往说明性能不错 |
* |
Using temporary:查询有使用临时表, 一般出现于排序, 分组和多表 join 的情况, 查询效率不高, 建议优化。 |
* |
Using where:WHERE 子句用于限制哪一个行匹配下一个表或发送到客户。 |
* |
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查询的所有列,而不要额外搜索硬盘访问实际的表。 |