MySQL执行计划(explain)
1.什么是执行计划
2.如何分析执行计划
执行计划一共有12列,每一列都有着特殊的含义,接下来我们逐一分析
id
select语句的查询顺序,包含一组数字,如果数字相同则从上到下,如果数字不同则从大到小。
select_type
查询的类型,可以为以下任意一种
- SIMPLE 简单SELECT语句,查询中不包含子查询或者union
- PRIMARY 查询中包含任何复杂的子部分,最外层被标记为primary
- UNION 若第二个select出现在union之后,则被标记为union;若union包含在from子句的子查询中,外层select将被标记为derived
- UNION RESULT UNION 的结果
- SUBQUERY 在select 或 where列表中包含了子查询
- DERIVED 在from列表中包含的子查询被标记为derived(衍生),mysql或递归执行这些子查询,把结果放在临时表里
table
查询所用的表
partitions
如果查询是基于分区表的,则显示查询访问的分区
type
访问类型
system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL
- system 表仅有一行(=系统表)
- const 表最多有一个匹配行,它将在查询开始时被读取。因为仅有一行,在这行的列值可被优化器剩余部分认为是常数。const表很快,因为它们只读取一次
- eq_ref 唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配。常见于主键 或 唯一索引扫描。
- ref 非唯一性索引扫描,返回匹配某个单独值的所有行
- range 只检索给定范围的行,使用一个索引来选择行。一般就是在where语句中出现了bettween、<、>、in等的查询。这种索引列上的范围扫描比全索引扫描要好
- index 该联接类型与ALL相同,除了只有索引树被扫描。这通常比ALL快,因为索引文件通常比数据文件小。
- ALL 遍历全表以找到匹配的行。
possible_keys
查询涉及到的字段上存在索引,则该索引将被列出,但不一定被查询实际使用
key
显示MySQL实际决定使用的键(索引)。如果没有选择索引,键是NULL。
key_len
表示索引中使用的字节数,查询中使用的索引的长度(最大可能长度),并非实际使用长度,理论上长度越短越好。key_len是根据表定义计算而得的,不是通过表内检索出的
ref
显示使用哪个列或常数与key一起从表中选择行。
rows
显示MySQL认为它执行查询时必须检查的行数。
filtered
显示了通过条件过滤出的行数的百分比估计值。
Extra
- Distinct MySQL发现第1个匹配行后,停止为当前的行组合搜索更多的行。
- Using filesort mysql对数据使用一个外部的索引排序,而不是按照表内的索引进行排序读取。也就是说mysql无法利用索引完成的排序操作成为“文件排序”
- Using temporary:使用临时表保存中间结果,也就是说mysql在对查询结果排序时使用了临时表,常见于order by 和 group by
- Using index 从只使用索引树中的信息而不需要进一步搜索读取实际的行来检索表中的列信息。
- Using where WHERE 子句用于限制哪一个行匹配下一个表或发送到客户
- Using join buffer使用了链接缓存
- Select tables optimized away: MySQL根本没有遍历表或索引就返回数据了,表示已经优化到不能再优化了
- Impossible WHEREwhere子句的值总是false,不能用来获取任何元祖