mysql执行计划EXPLAIN各字段简单认识
EXPLAIN SELECT * FROM `student` where id = 1
EXPLAIN是优化sql时必不可少的工具,查看sql执行计划能有效地帮助我们优化sql。 在sql语句前加EXPLAIN 关键字会出现如下图所示的执行计划,这篇主要就是简单认识了解下执行计划各个字段的意思。 id:代表查询的序号,多表查询时,序号决定了访问表的顺序。id不同时先访问序号大的,id相同时从上往下访问。
select_type:代表查询的类型,主要是区别普通查询和联合查询、子查询之类的复杂查询。 常见的查询类型: SIMPLE:简单的查询,查询中不包含子查询或者UNION PRIMARY:查询中若包含任何复杂的子部分,最外层查询则被标记为PRIMARY SUBQUERY:子查询中的第一个SELECT子句 DERIVED:FROM子句里的子查询,关联查询时临时建立的表 UNION:UNION里的第二条或最后的SELECT子句 UNION RESULT:UNION的结果
table:用的哪张表
partitions:将要使用的分区。只有出现PARTITIONS选项时才显示这列。对于非分区表,这个值为NULL。
type:连接类型 const:使用主键索引查询出一条数据的语句 system:特殊的存在,只有查系统表并且满足const时才会出现 eq_ref:当有关联查询时,用到了主键索引或唯一索引时,比如,有几张表查询时,对于前面的查询结果都正好能匹配到后面时,就会出现
以上三种基本上是很难遇到的,也就是最好的。优化也很难做到以上三种。
ref:用到了非唯一索引,对于关联查询用到了索引的左前缀 range:对索引进行了扫描,比如,>=、<=、in这些范围扫描 index:全名Full index scan,对于索引的而全部扫描,也就是拿到索引的全部数据,比不走索引要快,返回的字段多 ALL:全表扫描,效率低
possible_keys:MySQL认为可能使用到的索引
key:MySQL在指定表里查找行时实际用到的索引
key_len:实际使用的索引的长度。若MySQL会使用索引的最左前缀,则此数字可能会小于全文索引行的长度
ref:代表在执行过滤数据时,会使用哪个常量或字段来一块筛选数据
rows:代表mysql认为需要扫描表的行数(估值)
filtered:存储引擎筛选数据返回服务层后,server层再做过滤剩余多少满足条件数据的百分比。这个值越大越好。也就是说存储引擎层筛选完后不需要server层筛选时,这个值就会是100。
Extra:其他执行计划相关的信息。这个值或者为空白,或者包含一个或多个值 常见的有: Using index:使用到了索引 Using where:需要在server层再次进行过滤数据 Using filesort:排序相关,不能使用索引排序时会出现 Using temporary:代表得到结果前会创建使用临时表