博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

mysql explain详细解释

Posted on 2012-12-04 17:22  losen  阅读(218)  评论(0编辑  收藏  举报
 

例:    EXPLAIN SELECT peopleid FROM people WHERE firstname='Mike' AND lastname='Sullivan'  AND age='17';

       这个命令将返回下面这种分析结果:   

  table type possible_keys key key_len ref rows Extra

  people ref fname_lname_age fname_lname_age 102 const,const,const 1 Where used table:这是表的名字。  

  type:连接操作的类型。下面是MySQL文档关于ref连接类型的说明:  

  “对于每一种与另一个表中记录的组合,MySQL将从当前的表读取所有带有匹配索引值的记录。如果连接操作只使用键的最左前缀,或者如果键不是 UNIQUE或PRIMARY KEY类型(换句话说,如果连接操作不能根据键值选择出唯一行),则MySQL使用ref连接类型。如果连接操作所用的键只匹配少量的记录,则ref是一 种好的连接类型。”  

  在本例中,由于索引不是UNIQUE类型,ref是我们能够得到的最好连接类型。   

  如果EXPLAIN显示连接类型是“ALL”,而且你并不想从表里面选择出大多数记录,那么MySQL的操作效率将非常低,因为它要扫描整个表。你可以加入更多的索引来解决这个问题。预知更多信息,请参见MySQL的手册说明。  

  possible_keys:

  可能可以利用的索引的名字。这里的索引名字是创建索引时指定的索引昵称;如果索引没有昵称,则默认显示的是索引中第一个列的名字(在本例中,它是“firstname”)。默认索引名字的含义往往不是很明显。  

  Key:   

  它显示了MySQL实际使用的索引的名字。如果它为空(或NULL),则MySQL不使用索引。   

  key_len:  

  索引中被使用部分的长度,以字节计。在本例中,key_len是102,其中firstname占50字节,lastname占50字节,age占2字节。如果MySQL只使用索引中的firstname部分,则key_len将是50。  

  ref:  

  它显示的是列的名字(或单词“const”),MySQL将根据这些列来选择行。在本例中,MySQL根据三个常量选择行。  

  rows:  

  MySQL所认为的它在找到正确的结果之前必须扫描的记录数。显然,这里最理想的数字就是1。

  Extra:   

  这里可能出现许多不同的选项,其中大多数将对查询产生负面影响。在本例中,MySQL只是提醒我们它将用WHERE子句限制搜索结果集。