mysql explain 语句分析要点

explain
	id
		id相同,执行顺序由上至下
		id不同, 如果是子查询, id的序列会递增.id值越大优先级越高, 越先被执行
		id如果相同, 可以认为是一组, 从上往下顺序执行,在所有的组中, id值越大,优先级越高,越先执行
		衍生表, Derived 
	select_type
		simple
			简单表查询, 不包含子查询或者 union
		primary
			如果查询包含复杂的子部分, 最外层查询则被标记为 primary
		subquery
			Select 或者 where 列表中包含子查询
		derived
			在from 列表中包含的 子查询呗标记为derived(衍生), Mysql 会递归执行这些子查询, 把结果放在临时表中.
		union
			若第二个select 出现在 union之后, 则被标记为union , 若union 包含在from子句的子查询中, 外层的 Select 将被标记为  Derived
		union result
			从Union 表获取结果的 Select
	table
		当前执行的表
		derived2 这种写法, 是表示当前的表是后面某个子查询的结果的临时表
	type
		查询使用了那种类型, 执行效率  system > const  > eq_ref > ref  > range  > index > all
		all
			full table scan 将遍历全表以找到匹配的行
		index
			full index scan  , 遍历索引树,
		range
			只检索给定范围的行, 使用应该索引来选择行,  一般就是 between ,  <  >  in 等的查询
		ref
			非唯一性索引扫描, 返回匹配某个单独值所有的行, 本质也是一种索引服务, 它房号所有单独值的行, 然而它可能会找到多个符合条件的行, 所有他应该属于查找和扫描的混合体
		eq_ref
			唯一性索引扫描, 对于每一个索引建, 表只有一条记录与之匹配, 主键或者唯一索引扫描
		const
			通过一次索引就找到了,  通过 primary key  或者 unique 索引, 只匹配一行数据, 所以很快, 
		system
			表只有一行记录,等于系统表, 是 const 类型的特例
	possible_keys 
		显示这张表中可能用到的索引, 一个或多个
	key
		实际使用的索引,  如果为NULL 则没有使用索引
	key_len
		索引数据类型长度,在不损失精度的情况下, 长度越端越好. 包含一个长度用于 标识 空或者非空
	ref
		显示索引的哪一列被使用了, 如果可能的话,最好是一个常数.  哪些列或者常量被用于查找索引上的值 
	rows
		根据表统计信息及索引选用情况, 大致估算找到的记录需要读取的行数, 也就是说用的越少越好
	extra
		using filesort
			无法利用索引排序, 对数据使用应该外部的索引排序
		using temporary
			使用临时表排序
		using index
			使用了覆盖索引,避免访问表的数据
		using where
			索引被用来执行索引建值查找
		using join buffer
			使用连接缓存,比如在查询的时候, 多表join 
		impossible where 
			where 条件不成立, 不查询任何数据
		select  tables optimized away
			在没有使用 group by  子句的情况下, 基于 Min Max  或者对于 MyIsam 存储引擎优化 count(*) 操做, 不必到执行阶段再计算, 在执行计划生成阶段就完成优化
	子查询
		子查询展开
		Derived_merge
	mysql 临时表

image.png