mysqlExplain - juedaiyuer/researchNote GitHub Wiki

#mysql---explain查看执行计划#

sakila数据库实验

mysql> explain select customer_id,first_name,last_name from customer\G;

*************************** 1. row ***************************
	       id: 1
  select_type: SIMPLE
	    table: customer
   partitions: NULL
	     type: ALL
possible_keys: NULL
	      key: NULL
	  key_len: NULL
	      ref: NULL
	     rows: 523
	 filtered: 100.00
	    Extra: NULL
1 row in set, 1 warning (0.00 sec)

ERROR: 
No query specified

##id##

语句的执行顺序标识,如果在语句中没有子查询或联合,说明只有一个SELECT,于是这个列显示为1,否则内层的SELECT会顺序编号

##select_type##

显示了对应的查询是简单还是复杂SELECT

  1. SIMPLE 简单表,即不使用表连接或者子查询
  2. PRIMARY 主查询,即外层的查询
  3. UNION UNION中的第二个或者后面的查询语句
  4. SUBQUERY 子查询中的第一个SELECT

##table##

输出结果集的表

##type##

这是重要的列,显示连接使用了何种类型

性能最好到最差的连接类型

  1. system 表中仅有一行,即常量表
  2. const 单表中最多有一个匹配行,譬如primary key或者unique index
  3. eq_reg 多表连接中使用primary key或者unique key
  4. ref 同上一个类似,区别在于使用普通索引
  5. ref_or_null 与ref类似,区别在于条件包含对NULL的查询
  6. index_merge 索引合并优化
  7. unique_subquery in的后面是一个查询主键字段的子查询
  8. index_subquery 同unique_subquery类似,区别在于查询非唯一索引字段的子查询
  9. range 单表中的范围查询
  10. index 对于前面的每一行,都通过索引来得到数据
  11. ALL 对于前面的每一行,都通过全表扫描来得到数据

##possible_keys##

显示可能应用在这张表中的索引.如果为空,没有可能的索引

##key##

实际使用的索引.如果为NULL,则没有使用索引

##key_len##

索引长度,在不损失精确性的情况下,长度越短越好

##ref##

显示索引的哪一列被使用了,如果可能的话,是一个常数

##rows##

扫描行的数量

##extra##

  1. Using filesort(MySQL需要进行额外的步骤来发现如何对返回的行排序.它根据连接类型以及存储排序键值和匹配条件的全部行的行指针来排序全部行.查询需要优化);2. Using tempory(MySQL需要建立临时表来存储查询结果,这通常发生在对不同列集进行ORDER BY上,而不是GROUP BY上)

##source##

  • imooc
  • MySQL数据库开发,优化与管理维护(PDF:244)