永远不要跟别人比幸运,我从来没想过我比别人幸运,我也许比他们更有毅力,在最困难的时候,他们熬不住了,我可以多熬一秒钟、两秒钟,甚至更久。

Mysql的explain参数详解

数据库 新民 1825℃ 已收录 0评论

explain 是什么?

explain 是mysql数据库中的sql执行计划,当开发人员或者DBA输入一条sql执行后,mysql数据库会解析开发者或者DBA人员输入的sql,并对将数据库解析后的sql执行计划返回给开发者或者DBA,开发者或者DBA会通过返回的这些参数信息做sql语句的优化,接下来会对参数做一个简单的说明:

1、Id(表示mysql执行的表的顺序):

  • (1)id值相:执行顺序由上至下;

Sql语句:EXPLAIN  SELECT * FROM kjjx_customer_xyykt t ,  kjjx_customer_0001 t1, kjjx_customer_0002 t2;

执行结果:

  • (2)id值不同:如果是子查询,id的序号会递增;id值越大,优先级越高,越优先执行;

Sql语句:EXPLAIN  SELECT * FROM kjjx_order_0001_z160501 WHERE customerID=(SELECT customerID FROM kjjx_customer_xyykt WHERE customerID=’8a0191b558a0bd5f0158a0be78f90001′)

执行结果:

  • (3)id值相同不同,同时存在:id如果相同,可以认为是一组,从上往下顺序执行,在所有组中,id值越大,优先值越高,越优先执行;

Sql语句:EXPLAIN  SELECT t.* FROM (

SELECT * FROM kjjx_customer_xyykt k WHERE k.password =”)t,                                                                  `kjjx_order_0001_z160501` o

WHERE t.customerID=o.customerID

执行结果:

2、select_type(查询类型):

select_type(查询类型),主要用于区别普通查询、联合查询、子查询等的复杂查询,select_type一共有6个值分别是:

  • SIMPLE:简单的select 查询,查询中不包含子查询或者UNION;
  • PRIMARY:查询中若包含复杂的子部分,最外层查询则被标记为PRIMARY;
  • SUBQUERY:在select中或 where中包含了子查询;
  • DERIVED:在form 列表中包含的子查询被标记为DERIVED(衍生),Mysql会递归执行这条些子查询,把结果集放在临时表里;
  • UNION:若第二个sql语句出现在UNION之后,则被标记为UNION;若UNION出现在from的子句查询中,外层select将被标记为DERIVED;
  • UNION RESULT:从UNION表中获取结果的select(UNION ALL);

3、table:查询的数据表名或者表的别名;

4、type(访问类型排列):

type访问类型排列,显示查询使用了何种类型,从最好到最差一次是:

sysytem>const>eq_ref>ref>range>index>ALL,

一般来说,得保证查询至少达到reange ,最好能达到ref,

下面是这8个值得详解:

  • ALL:表示全表扫描,若表中数据有百万乃至千万,必须要优化,否则性能很慢;
  • Index:full index scan,Index 与 ALL 的区别为index只遍历索引树,这通常比ALL快,因为索引文件通常比数据文件小(也就是说ALL和index 都是读全表,但是index是从索引中读取的,而ALL 是从硬盘中读取的。)。
  • range:只检索给定范围的行,使用一个索引来选择行,key列显示使用了那个索引,一般就是在你的where 语句中出现了between、>、<、in 等的查询,这种范围扫描比全表扫描要好,因为它只需要开始索引的某一点,而结束语另一点,不用扫描全部索引。
  • ref:非唯一性索引扫描,返回匹配某个单独值得所有行,本质上也是一种索引访问,它返回所有匹配某个单独值得行,然而,它可能会找到多个符合条件的行,所以它应该属于查找和扫描的混合体;
  • eq_ref:唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配,常见于主键或唯一索引扫描;
  • const:表示通过索引一次就找到了,const用户比较primary key 或者 unique 索引。因为只匹配一行数据,所以很快;如将逐渐置于where 列表中,Mysql就能将改查询转换为一个常量;
  • system:表示只有一行记录(等于系统表),这是const类型的特列,平时不会出现,可以忽略不记;

5、possible_keys:

显示可能应用在表中的索引,possible_keys的值一个或多个,查询到的字段若存在索引,则该索引将被     列出,但不一定被查询实际使用;

6、key:实际使用到的索引,如果为NULL 则表示没有使用索引;若查询中使用了覆盖索引,则该索引进 出现在key 列表中;

7、Key_len:表示索引中使用到的字节数,可通过该列计算查询中使用的索引的长度,在不损失精确性的情况下,长度越短越好,key_len 显示的值索引字段的最大可能长度,并非实际使用长度,即key_len 是根据表定义计算而得,不是通过表内检索出的;

8、ref:显示索引的哪一列被使用了,如果可能的话,是一个常数。哪些列或常量被用于查找索引列上的值;

9、rows:根据表统计信息及索引选用情况,大致估算出找到所需的记录所需要读取的行数;

10、Extra:包含不适合在其它列中显示但十分重要的额外信息;

(1)Using filesort:说明Mysql会对数据使用一个外部的索引排序,而不是按照表内的顺序进行读取数据,Mysql中无法利用索引完成的排序操作称为“文件排序”(性能很慢,因为排序没有用到索引,而Mysql自己又重新排了一次顺序);

(2)Using temporary:使用了临时表保存中间结果集,Mysql对查询结果排序时使用了临时表,常见于排序order by 和 分组查询 group by;(性能极慢,因为查询中Mysql要创建临时表,查询完毕要删除临时表);

(3)Using index:表示相应的select操作中使用了覆盖索引(Govering index),避免访问了表的数据行,效率和性能不错!若同时出现Using where ,表示索引被用来执行索引键值的查找;若没有同时出现Using where,表明索引用来读取数据而非执行查找工作;

(4)Using where:表明使用了where 过滤;

(5)Using join buffer:使用了连接缓存(注:若sql中join 比较多时,建议在配置文件中配置join buffer 大一些);

(6)impossible where:where 子句的值总是false,不能用来获取任何元组;

(7)select tables optimized away:在没有group by 的子句情况下,基于索引优化min/max 操作或者对于MyISAM 存储引擎优化count(*) 操作,不必等到执行阶段再进行计算,查询执行计划生成的阶段即完成优化;

(8)distinct:优化distinct 操作,在查找第一匹配的元组后即停止找同样值得动作;

 

本站文章如未注明,均为原创丨本网站采用BY-NC-SA协议进行授权,转载请注明转自:http://www.snowruin.com/?p=1665
喜欢 (2)or分享 (0)
发表我的评论
取消评论
表情 代码 贴图 加粗 链接 私信 删除线 签到

Hi,请填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址