目录
1. 能干什么
2. 如何分析
3. 各字段解释
1. 能干什么
使用 explain+sql 的方式,分析查询语句的性能瓶颈。
① 表的读取顺序;② 数据读取操作的操作类型;③ 哪些索引可以使用;④ 哪些索引被实际使用;⑤ 表之间的引用;⑥ 每张表有多少行被优化器查询。
2. 如何分析
先看一下,执行下面每一条 SQL 后各自对应的结果。
EXPLAIN SELECT * FROM USER WHERE NAME = "刘德华"
EXPLAIN SELECT * FROM USER WHERE NAME = "栈老师"
EXPLAIN SELECT * FROM USER WHERE ID = 1
EXPLAIN SELECT * FROM USER WHERE ID = 5 




先进行一下简单的分析,从执行计划中可以看出:
① 依据索引查的话,type 和 ref 的值都为 const,而依据名字查时,type 的值是 all,代表全表查找,ref 为空;
② 索引查询相关的 key 列都是 primary,并且 key 的长度正是索引的长度(int 类型为 4);
③ row 代表找到数据之前,扫描的行数,索引查询的 row 为 1,名字查询的 row 为 6,因为它要进行全表扫描,扫描 6 条数据;
④ filtered = 100 * 最终记录数 / 扫描记录数,显然,filter 越大性能越好。对于索引查询,我们最终查到了一条数据,它也只扫描了一次,所以最终的 filtered 就是 100,名字查询的 filter = 100 * 1 / 6 = 16.67。
3. 各字段解释
 
 1. id 
 : 
 select  
 查询的序列号,包含一组数字,表示查询中执行 
  select  
 子句或操作表的顺序。 
 
 
 
 2. select_type:代表查询的类型,主要是用于区别普通查询、联合查询、子查询等的复杂查询,取值范围如下:  
 
 
  simple 
  :简单的 
   select  
  查询,查询中不包含子查询或者 
   UNION  
 
 
  
  primary 
  :查询中若包含任何复杂的子部分,最外层查询则被标记为 
   primary  
 
 
  
  derived 
  :在 
   FROM  
  列表中包含的子查询被标记为 
   DERIVED ( 
  衍生 
  ) 
  , 
  MySQL  
  会递归执行这些  
 
 
  
  子查询 
  ,  
  把结果放在临时表里。  
 
 
  
  subquery 
  :在 
   SELECT  
  或 
   WHERE  
  列表中包含了子查询  
 
 
  
  depedent subquery 
  :在 
   SELECT  
  或 
   WHERE  
  列表中包含了子查询,子查询基于外层  
 
 
  
  uncacheable subquery 
  :无法使用缓存的子查询  
 
 
  
  union 
  :若第二个 
   SELECT  
  出现在 
   UNION  
  之后,则被标记为 
   UNION 
  ;若 
   UNION  
  包含在  
 
 
  
  FROM  
  子句的子查询中,外层 
   SELECT  
  将被标记为: 
  DERIVED  
 
 
  
  union result 
  :从 
   UNION  
  表获取结果的 
   SELECT 
 
 
 
 3. table 
 :这个数据是基于哪张表的。  
 
 
 
 4. type:是查询的访问类型。是较为重要的一个指标,结果值从最好到最坏依次是: 
 system > const > eq_ref > ref > range > index > ALL。 
 
 
 
  system 
  :表只有一行记录(等于系统表),这是 
   const  
  类型的特列,平时不会出现,这个也  
 
 
  
  可以忽略不计。  
 
 
  
  const 
  :表示通过索引一次就找到了, 
  const  
  用于比较 
   primary key  
  或者 
   unique  
  索引。因为  
 
 
  
  只匹配一行数据,所以很快。如将主键置于 
   where  
  列表中, 
  MySQL  
  就能将该查询转换为一个  
 
 
  
  常量。  
 
 
  
  eq_ref 
  :唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配。常见于主键或唯一  
 
 
  
  索引扫描。  
 
 
  
  ref 
  :非唯一性索引扫描,返回匹配某个单独值的所有行。本质上也是一种索引访问,它返回  
 
 
  
  所有匹配某个单独值的行,然而,它可能会找到多个符合条件的行,所以他应该属于查找和扫  
 
 
  
  描的混合体。  
 
 
  
  range 
  :只检索给定范围的行,使用一个索引来选择行。 
  key  
  列显示使用了哪个索引一般就是  
 
 
  
  在 
   where  
  语句中出现了 
   between 
  、 
  < 
  、 
  > 
  、 
  in  
  等的查询这种范围扫描索引扫描比全表扫描要  
 
 
  
  好,因为它只需要开始于索引的某一点,而结束语另一点,不用扫描全部索引。  
 
 
  
  index 
  :出现 
   index  
  是 
   sql  
  使用了索引但是没用索引进行过滤,一般是使用了覆盖索引或者是  
 
 
  
  利用索引进行了排序分组。 
 
 
  
  all 
  :将遍历全表以找到匹配的行。 
 
 
  
  
   5. possible_keys 
   :显示可能应用在这张表中的索引,一个或多个。查询涉及到的字段上若存在索  
  
 
   
   引,则该索引将被列出,但不一定被查询实际使用。  
  
 
   
   
   6. key 
   :实际使用的索引。如果为 
    NULL 
   ,则没有使用索引。  
  
 
   
   
   7. key_len 
   :表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度。 
   key_len  
   显示的值为索引字段的最大可能长度,并非实际使用长度。 
  
 
  
 8. ref 
 :显示索引的哪一列被使用了,如果可能的话,是一个常数。哪些列或常量被用于查找索引列上的值。  
 
 
 
 9. rows 
 :显示 
  MySQL  
 认为它执行查询时必须检查的行数,越少越好。 
 
 
 
 10. Extra:其他的额外重要的信息。  
                


















