面试前必须知道的MySQL命令【explain】

  只有光头才能变强

  刷面试题的时候,不知道你们有没有见过MySQL这两个命令:explain和profile(反正我就见过了)…

  之前虽然知道这两个命令大概什么意思,但一直没有去做笔记。今天发现自己的TODO LIST有这么两个命令,于是打算来学习一番,记录一下~

  使用的MySQL的版本为5.6.38

  

 

  首先我们来体验一下explain命令是怎么使用的,以及输出的结果是什么:

  输出结果:

  

 

  发现很使用起来很简单,只要explain后边跟着SQL语句就完事了(MySQL5.6之前的版本,只允许解释SELECT语句,从 MySQL5.6开始,非SELECT语句也可以被解释了)。

  我们很多时候编写完一条SQL语句,往往想知道这条SQL语句执行是否高效。或者说,我们建立好的索引在这条SQL语句中是否使用到了,就可以使用explain命令来分析一下!

  ·简单来说:通过explain命令我们可以学习到该条SQL是如何执行的,随后解析explain的结果可以帮助我们使用更好的索引,最终来优化它!

  通过explain命令我们可以知道以下信息:表的读取顺序,数据读取操作的类型,哪些索引可以使用,哪些索引实际使用了,表之间的引用,每张表有多少行被优化器查询等信息。

  // 好了,我们下面看一下explain出来的结果是怎么看的。

  explain命令输出的结果有10列:id、select_type、table、type、possible_keys、key、key_len、ref、rows、Extra

  包含一组数字,表示查询中执行SELECT子句或操作表的顺序。

  在id列上也会有几种情况:

  ·如果id相同执行顺序由上至下。

  ·如果id不相同,id的序号会递增,id值越大优先级越高,越先被执行。

  o (一般有子查询的SQL语句id就会不同)

  

 

  表示select查询的类型

  select_type属性下有好几种类型:

  ·SIMPLLE:简单查询,该查询不包含 UNION 或子查询

  ·PRIMARY:如果查询包含UNION 或子查询,则最外层的查询被标识为PRIMARY

  ·UNION:表示此查询是 UNION 中的第二个或者随后的查询

  ·DEPENDENT:UNION 满足 UNION 中的第二个或者随后的查询,其次取决于外面的查询

  ·UNION RESULT:UNION 的结果

  ·SUBQUERY:子查询中的第一个select语句(该子查询不在from子句中)

  ·DEPENDENT SUBQUERY:子查询中的 第一个 select,同时取决于外面的查询

  ·DERIVED:包含在from子句中子查询(也称为派生表)

  ·UNCACHEABLE SUBQUERY:满足是子查询中的第一个 select 语句,同时意味着 select 中的某些特性阻止结果被缓存于一个 Item_cache 中

  ·UNCACHEABLE UNION:满足此查询是 UNION 中的第二个或者随后的查询,同时意味着 select 中的某些特性阻止结果被缓存于一个 Item_cache 中

  类型有点多啊,我加粗的是最常见的,起码要看得懂加粗的部分。

  该列显示了对应行正在访问哪个表(有别名就显示别名)。

  当from子句中有子查询时,table列是derivenN格式,表示当前查询依赖id=N的查询,于是先执行id=N的查询

  该列称为关联类型或者访问类型,它指明了MySQL决定如何查找表中符合条件的行,同时是我们判断查询是否高效的重要依据。

  以下为常见的取值

  ·ALL:全表扫描,这个类型是性能最差的查询之一。通常来说,我们的查询不应该出现 ALL 类型,因为这样的查询,在数据量最大的情况下,对数据库的性能是巨大的灾难。

  ·index:全索引扫描,和 ALL 类型类似,只不过 ALL 类型是全表扫描,而 index 类型是扫描全部的索引,主要优点是避免了排序,但是开销仍然非常大。如果在 Extra 列看到 Using index,说明正在使用覆盖索引,只扫描索引的数据,它比按索引次序全表扫描的开销要少很多。

  ·range:范围扫描,就是一个有限制的索引扫描,它开始于索引里的某一点,返回匹配这个值域的行。这个类型通常出现在=、、、=、、=、IS NULL、=、BETWEEN、IN()的操作中,key 列显示使用了哪个索引,当 type 为该值时,则输出的 ref 列为 NULL,并且key_len 列是此次查询中使用到的索引最长的那个。

  ·ref:一种索引访问,也称索引查找,它返回所有匹配某个单个值的行。此类型通常出现在多表的 join 查询, 针对于非唯一或非主键索引, 或者是使用了最左前缀规则索引的查询。

  ·eq_ref:使用这种索引查找,最多只返回一条符合条件的记录。在使用唯一性索引或主键查找时会出现该值,非常高效。

  ·const、system:该表至多有一个匹配行,在查询开始时读取,或者该表是系统表,只有一行匹配。其中 const 用于在和 primary key 或 unique 索引中有固定值比较的情形。

  ·NULL:在执行阶段不需要访问表。

  这一列显示查询可能使用哪些索引来查找

  这一列显示MySQL实际决定使用的索引。如果没有选择索引,键是NULL。

  这一列显示了在索引里使用的字节数,当key列的值为 NULL 时,则该列也是NULL

  这一列显示了哪些字段或者常量被用来和key配合从表中查询记录出来。

  这一列显示了估计要找到所需的行而要读取的行数,这个值是个估计值,原则上值越小越好。

  其他的信息

  常见的取值如下:

  ·Using index:使用覆盖索引,表示查询索引就可查到所需数据,不用扫描表数据文件,往往说明性能不错。

  ·Using Where:在存储引擎检索行后再进行过滤,使用了where从句来限制哪些行将与下一张表匹配或者是返回给用户。

  ·Using temporary:在查询结果排序时会使用一个临时表,一般出现于排序、分组和多表 join 的情况,查询效率不高,建议优化。

  ·Using filesort:对结果使用一个外部索引排序,而不是按索引次序从表里读取行,一般有出现该值,都建议优化去掉,因为这样的查询 CPU 资源消耗大。

  原本以为Explain命令是比较难学的,但查找资料看下来,之前只是不知道具体的列和列中下的属性是什么意思而已。常见出现的其实也就那么几个,感觉对着每个属性多看一会,还是可以能看懂的。

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值