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
for(Map
List
}
所以联表查询时,应该避免使⽤lect*,lect精确查找的字段并为此字段添加索引,如:
=
index&eq_
//相当于执⾏以下循环
List
for(Map
List
}
或加where条件并给此条件字段加索引:
explainlect*==1
ref&eq_
//相当于执⾏以下循环
List
for(Map
List
}
所以: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小时内删除。
留言与评论(共有 0 条评论) |