mysql explain 的使用
explain 执行计划字段
- id 字段 表示sql执行顺序(子查询等复杂的sql会体现出来)
id 值相同则从上向下执行, 不同则值越大优先级越高 - select_type
- simple 不包含子查询或union
- primary 查询中包含任何复杂的部分, 最外层的就是primary
- subquery select或where 后包含子查询
- derived from中包含的子查询
- union 若第二个select出现在union之后 就会被标记为union
- union result 从union表中获取结果的select
- table 字段 表示sql操作是属于那张表
- parttions
- type
表示查询使用的访问类型,type的值共有8种, 表示着查询的好坏, 从好到差依次为: system>const>eq_ref>ref>range>index>ALL- system 一般是查询系统表, 开发中几乎不会出现
- const 表示一次索引就能找到结果, 常出现于primary key和 unique索引.
- eq_ref 唯一索引扫描, 对于每个索引键表中都有一条记录与之匹配.常见于主键 或唯一索引扫描
- ref 非唯一索引扫描
- range 只检索给定范围的行, 对于查找范围的列只会使用一个索引列
- index 全索引扫描. index和all的区别: index只遍历索引树,从索引中读取, all是从磁盘中读取.
- ALL 全表扫描
一般来说至少要达到range级别,最好是能达到ref
- possible_keys和key、key_len
possible_keys:显示可能应用在表中的索引,可能一个或多个。查询涉及到的字段若存在索引,则该索引将被列出,但不一定被查询实际使用。
key:实际中使用的索引,如为NULL,则表示未使用索引。若查询中使用了覆盖索引,则该索引和查询的select字段重叠。
key_len:表示索引中所使用的字节数,可通过该列计算查询中使用的索引长度。在不损失精确性的情况下,长度越短越好。key_len显示的值为索引字段的最大可能长度,并非实际使用长度,即key_len是根据表定义计算而得,并不是通过表内检索出的。
简单理解:possible_keys表示理论上可能用到的索引,key表示实际中使用的索引。
possible_keys为NULL表示可能未用到索引,但key=idx_deptid表示在实际查询的过程中进行了索引的全扫描。 - ref
显示关联的字段。如果使用常数等值查询,则显示const,如果是连接查询,则会显示关联的字段。 - rows
根据表统计信息及索引选用情况大致估算出找到所需记录所要读取的行数。当然该值越小越好。 -
filtered
百分比值,表示存储引擎返回的数据经过滤后,剩下多少满足查询条件记录数量的比例。
-
Extra
显示十分重要的额外信息。其取值有以下几个:
#1.Using filesort
Using filesort表明mysql会对数据使用一个外部的索引排序,而不是按照表内的索引顺序进行读取。
mysql中无法利用索引完成的排序操作称为“文件排序”。
出现Using filesort就非常危险了,在数据量非常大的时候几乎“九死一生”。出现Using filesort尽快优化sql语句。
#2.Using temporary
使用了临时表保存中间结果,常见于排序order by和分组查询group by。非常危险,“十死无生”,急需优化。
#3.Using index
表明相应的select操作中使用了覆盖索引,避免访问表的额外数据行,效率不错。
如果同时出现了Using where,表明索引被用来执行索引键值的查找。(where deptid=1)
如果没有同时出现Using where,表明索引用来读取数据而非执行查找动作。
总结
explain(执行计划)包含的信息十分的丰富,着重关注以下几个字段信息。
①id,select子句或表执行顺序,id相同,从上到下执行,id不同,id值越大,执行优先级越高。
②type,type主要取值及其表示sql的好坏程度(由好到差排序):system>const>eq_ref>ref>range>index>ALL。保证range,最好到ref。
③key,实际被使用的索引列。
④ref,关联的字段,常量等值查询,显示为const,如果为连接查询,显示关联的字段。
⑤Extra,额外信息,使用优先级Using index>Using filesort(九死一生)>Using temporary(十死无生)。
着重关注上述五个字段信息,对日常生产过程中调优十分有用。




浙公网安备 33010602011771号