mysql explain性能解析
explain执行计划结果
+----+-------------+-------------------------+------+---------------+------+---------+------+------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------------------------+------+---------------+------+---------+------+------+-------+
- id
id是用来顺序标识整个查询中SELELCT 语句的,如果是子查询,id的序号会递增,id值越大优先级越高,越先被执行。该值可能为NULL。 - select_type
| |
---|
simple | 简单子查询,不包含子查询和union |
primary | 包含union或者子查询,最外层的部分标记为primary |
subquery | 一般子查询中的子查询被标记为subquery,也就是位于select列表中的查询 |
derived | 派生表——该临时表是从子查询派生出来的,位于form中的子查询 |
union | 位于union中第二个及其以后的子查询被标记为union,第一个就被标记为primary如果是union位于from中则标记为derived |
union result | 用来从匿名临时表里检索结果的select被标记为union result |
dependent union | 首先需要满足UNION的条件,及UNION中第二个以及后面的SELECT语句,同时该语句依赖外部的查询 |
subquery | 子查询中第一个SELECT语句 |
dependent subquery | 和DEPENDENT UNION相对UNION一样 |
- table
输出行所引用的表 - type
表示按某种类型来查询,例如按照索引类型查找,按照范围查找。
常用的类型有: ALL, index, range, ref, eq_ref, const, system, NULL(从左到右,性能从差到好)
| |
---|
ALL | Full Table Scan, MySQL将遍历全表以找到匹配的行 |
index | Full Index Scan,index与ALL区别为index类型只遍历索引树 |
range | 只检索给定范围的行,使用一个索引来选择行 |
ref | 表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列 |
eq_ref | 类似ref,区别就在使用的索引是唯一索引,对于每个索引键值,表中只有一条记录匹配,简单来说,就是多表连接中使用primary key或者 unique key作为关联条件 |
const、system | 当MySQL对查询某部分进行优化,并转换为一个常量时,使用这些类型访问。如将主键置于where列表中,MySQL就能将该查询转换为一个常量,system是const类型的特例,当查询的表只有一行的情况下,使用system |
NULL | MySQL在优化过程中分解语句,执行时甚至不用访问表或索引,例如从一个索引列里选取最小值可以通过单独索引查找完成。 |
- possible_keys
可能用到的索引,保存的是索引名称,如果是多个索引的话,用逗号隔开。如果该列是NULL,则没有相关的索引。在这种情况下,可以通过检查WHERE子句看是否它引用某些列或适合索引的列来提高查询性能。 - key
实际用到的索引,保存的是索引名称,如果是多个索引的话,用逗号隔开,这一列显示mysql实际采用哪个索引来优化对该表的访问,
如果没有使用索引,则该列是 NULL。 - key_len
表示本次查询中,所选择的索引长度有多少字节,不损失精确性的情况下,长度越短越好,索引最大长度是768字节,当字符串过长时,mysql会做一个类似左前缀索引的处理,将前半部分的字符提取出来做索引。 这一列显示了mysql在索引里使用的字节数,通过这个值可以算出具体使用了索引中的哪些列。 - ref
显示索引的哪一列被使用了,表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值 - rows
显示mysql认为执行查询时必须要返回的行数,这一列是mysql估计要读取并检测的行数,注意这个不是结果集里的行数,表示MySQL根据表统计信息及索引选用情况,估算的找到所需的记录所需要读取的行数。 - Extra
额外的信息,例如:using file sort ,using where, using join buffer,using index等。
| |
---|
distinct | mysql找到了与行相联合匹配的行之后,就不再搜索了 |
Using index | 这发生在对表的请求列都是同一索引的部分的时候,返回的列数据只使用了索引中的信息,而没有再去访问表中的行记录。是性能高的表现。 |
Using where | mysql服务器将在存储引擎检索行后再进行过滤。就是先读取整行数据,再按 where 条件进行检查,符合就留下,不符合就丢弃。 |
Using temporary | mysql需要创建一张临时表来处理查询。出现这种情况一般是要进行优化的,首先是想到用索引来优化。 |
Using filesort | mysql 会对结果使用一个外部索引排序,而不是按索引次序从表里读取行。此时mysql会根据联接类型浏览所有符合条件的记录,并保存排序关键字和行指针,然后排序关键字并按顺序检索行信息。这种情况下一般也是要考虑使用索引来优化的。 |