MySQL执行计划
id 表的读取顺序
执行优先级,id相同从上到下依次执行,id不同,id从大到小依次执行
select_type 查询类型
simple 简单查询,不包含子查询,union
primary 最外层的查询 ,鸡蛋壳,查询中包含任何复杂的子查询时,最外层的查询。
subquery 在select 或 where中包含的子查询
derived 在from中包含的子查询被标记为derived(衍生)MySQL会递归的执行这些子查询,把结果放在临时表。derived后的数字即为id
union 若第二个select 出现在union之后则被标记位union;若union包含在from子句的查询中,外层select 被标记未derived;
union result 两个union合并的结果集
type
从最好到最差
system 》 const 》 eq_ref》 ref 》 range 》 index 》all
-
system
单表单行记录,等价于系统表 -
const
表示通过索引一次找到了记录,const用于比较主键列或唯一索引列,索引很快,如果主键置于where中,MySQL就可以把该查寻替换为一个常量。 -
eq_ref
唯一性索引扫描,对于每个索引键,表中只有一条记录与之对应
select * from t1,t2 where t1.id=t2.id -
ref
非为一性索引扫描, 返回返回匹配某个单独值的所有行;
select * from t where col = ’s'; -
range
只检索给定范围的行key显示用了那和索引,一般是在where中出现了范围查询,它开始于索引的一点,结束语索引的另一个点,比全表扫描快。
select * from t where id between 1 and 10; -
index
Full index scan 全索引扫描
index和all的区别为index只遍历索引树,通常比all快,因为索引文件更小。都是都全表。
select id from t1; -
all
全表扫描;
possible keys
可能用到的索引。
key
实际用到的索引,为null 表示没有用到索引。或者没建立索引
拆卸像那种若使用到了覆盖索引,则该索引只出现在key这一列中;
key_len
表示索引中使用到的字节数,可通过该列计算查询寻中使用到额索引的长度,再不损失精度的情况下,用的越少越好。
显示的值为索引字段的最大长度,并非实际使用长度,即key_len是根据表定义计算而得,不是通过表内检索出的。
比如:col1 列 索引长度13,col2 列 索引长度13 where col1 = ‘ss’ key_len = 13 where col1 = 'a' and col2 ='s' key_len = 26
ref
type 为 ref/eq_ref 时
显示哪一列被使用了,如果可能的话,最好是一个常数。
库.表.字段 const
rows
根据表统计信息和索引使用情况,大致估算出找到所需记录所需要读取的行数
filterd
过滤掉了多少行
extra
- using filesort 需要优化
说明 MySQL会对数据使用一个外部的索引排序, 而不是按照表内的索引顺序进行读取。MySQL中无法使用索引完成的排序操作成为文件排序。 - using tempory 必须优化
使用了临时表保存中间结果,MySQL对查询结果排序时使用临时表,常见于order by group by - using index 覆盖索引(查询的列被所建的索引覆盖)
表明使用了发覆盖索引,避免访问数据行(回表)
如果出现了using where 说明索引被用来执行索引键值的查找;
如果没有using where 说明索引直接用来读取数据。 - using where
表明使用了where 过滤 - using join buffer
使用了连接缓存, - impossible where
where 子句的值总是false,不能用来获取元素。
where id= 1 and id = 3; - select tables optmized away
没有group by 子句的情况下,基于索引min/max操作或者对于myisam存储疫情优化count(*),不必等到执行阶段计算,查询执行计划生成的阶段即可完成优化。 - distinct
找到第一个匹配的时候就返回。