explain是什么意思

更新时间:2022-12-27 20:50:39 阅读: 评论:0


2022年12月27日发(作者:ambulance)

mysql索引explain的type

⼀、如何评估sql的质量与效率?

当⼀个sql查询语句被写出来之后,其实你的⼯作只完成了⼀⼩半,接下来更重要的⼯作是评估你⾃⼰写的sql的质量与效率。mysql为我们提供了

很有⽤的辅助武器explain,它向我们展⽰了mysql接收到⼀条sql语句的执⾏计划。根据explain返回的结果我们便可以知道我们的sql写的怎么

样,是否会造成查询瓶颈,同时根据结果不断的修改调整查询语句,从⽽完成sql优化的过程。

虽然explain返回的结果项很多,这⾥我们只重点关注三个,分别是type,key,rows。其中key表明的是这次查找中所⽤到的索引,rows是指

这次查找数据所扫描的⾏数(这⾥可以先这样理解,但实际上是内循环的次数)。⽽type则是本⽂要详细记录的连接类型,前两项重要⽽且简

单,⽆需多说。type表⽰MySQL在表中找到所需⾏的⽅式,⼜称"访问类型"。

⼆、都有哪些type?

mysql5.7中type的类型达到了14种之多,这⾥只记录和理解最重要且经常遇见的六种类型,它们分别是

All,index,range,ref,eq_ref,const。从左到右,它们的效率依次是增强的。撇开sql的具体应⽤环境以及其他因素,你应当尽量优化你的

sql语句,使它的type尽量靠右,但实际运⽤中还是要综合考虑各个⽅⾯的。

const:查找主键索引或unique唯⼀索引,返回的数据⾄多⼀条(0或者1条)。属于精确查找

eq_ref:查找唯⼀性索引,返回的数据⾄多⼀条。属于精确查找

ref:查找⾮唯⼀性索引,返回匹配某⼀条件的多条数据。属于精确查找、数据返回可能是多条

range:查找某个索引的部分索引,⼀般在where⼦句中使⽤<、>、in、between等关键词。只检索给定范围的⾏,属于范围查找

index:查找所有的索引树,⽐ALL要快的多,因为索引⽂件要⽐数据⽂件⼩的多。

ALL:不使⽤任何索引,进⾏全表扫描,性能最差。

从下到上逐渐变好,使⽤的索引⾄少要达到range级别。

1、All

全表扫描(FullTableScan),MySQL将遍历全表以找到匹配的⾏。status没有索引。

explainlect*fromsmswhereSTATUS=2;

为status字段添加索引:

2、index

全索引扫描(FullIndexScan),index与ALL区别为index类型只遍历索引树.。MYSQL遍历整个索引来查找匹配的⾏。

explainlectSTATUSfromsms;

虽然where条件中没有⽤到索引,但是要取出的列status是索引包含的列,所以只要全扫描status索引即可,直接使⽤索引树查找数据.

3、range

range指的是有范围的索引扫描,相对于index的全索引扫描,它有范围限制,因此要优于index。关于range⽐较容易理解,需要记住的是出现了

range,则⼀定是基于索引的。索引范围扫描,常见于'<','<=','>','>=','between','and','in',or等操作符。

explainlect*fromsmswherestatus>1;

4、ref

出现该连接类型的条件是:查找条件列使⽤了索引⽽且不为主键和unique。其实,意思就是虽然使⽤了索引,但该索引列的值并不唯⼀,有重

复。这样即使使⽤索引快速查找到了第⼀条数据,仍然不能停⽌,要进⾏⽬标值附近的⼩范围扫描。但它的好处是它并不需要扫全表,因为索引是

有序的,即便有重复值,也是在⼀个⾮常⼩的范围内扫描。

explainlect*fromsmsWHERESTATUS=1;

5、eq_ref

类似ref,区别就在使⽤的索引是唯⼀索引。在联表查询中使⽤primarykey或者uniquekey作为关联条件。ref_eq与ref相⽐⽜的地⽅是,

它知道这种类型的查找结果集只有⼀个?什么情况下结果集只有⼀个呢!那便是使⽤了主键或者唯⼀性索引进⾏查找的情况,⽐如根据学号查找某

⼀学校的⼀名同学,在没有查找前我们就知道结果⼀定只有⼀个,所以当我们⾸次查找到这个学号,便⽴即停⽌了查询。这种连接类型每次都进⾏

着精确查询,⽆需过多的扫描,因此查找效率更⾼,当然列的唯⼀性是需要根据实际情况决定的。

explainlect*=

all&eq_

//相当于执⾏以下循环

List>resultA=lect*fromsmsa

for(Mapmap:resultA){

List>resultB=lect*=("id")

}

所以联表查询时,应该避免使⽤lect*,lect精确查找的字段并为此字段添加索引,如:

=

index&eq_

//相当于执⾏以下循环

List>resultA=fromsmsa

for(Mapmap:resultA){

List>resultB=lect*=("id")

}

或加where条件并给此条件字段加索引:

explainlect*==1

ref&eq_

//相当于执⾏以下循环

List>resultA=lect*=1

for(Mapmap:resultA){

List>resultB=lect*=("id")

}

所以:where条件决定是a表的查询效率,b表中联合查找的字段即id决定的是b表的查询效率

6、const

如将主键或unique字段置于where列表中,MySQL就能将该查询转换为⼀个常量。

explainlectSTATUSfromsmsWHEREid=1;

本文发布于:2022-12-27 20:50:39,感谢您对本站的认可!

本文链接:http://www.wtabcd.cn/fanwen/fan/90/42562.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

下一篇:humanoid
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图