版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:[https://blog.csdn.net/u014427391/article/details/100853310](https://blog.csdn.net/u014427391/article/details/100853310)
继上一篇博客《MySQL的索引知识学习笔记》之后,我再记录一篇MySQL执行计划方面的博客,本博客是我在学习尚硅谷的学习教程后,做的笔记,当然我不是为了所谓宣传,仅仅是学习记录的笔记。本来可以不分享出来,不过,分享出来的笔记不仅可以给网上的学习者参考学习,同时写在csdn比较方便,可以支持图片上传,也方便自己以后查找复习
附录:我创建的数据库方面的专栏
- [一、执行计划概念](http://yehe.isd.com/column/support-plan/article-edit/6157566#_9)
- [二、Explain用法](http://yehe.isd.com/column/support-plan/article-edit/6157566#Explain_12)
- [三、Explain属性介绍](http://yehe.isd.com/column/support-plan/article-edit/6157566#Explain_39)
- [3.1 id属性](http://yehe.isd.com/column/support-plan/article-edit/6157566#31_id_44)
- [3.2 select\_type属性](http://yehe.isd.com/column/support-plan/article-edit/6157566#32_select_type_60)
- [3.3 table属性](http://yehe.isd.com/column/support-plan/article-edit/6157566#33_table_79)
- [3.4 type属性](http://yehe.isd.com/column/support-plan/article-edit/6157566#34_type_82)
- [3.5 possible\_keys属性](http://yehe.isd.com/column/support-plan/article-edit/6157566#35_possible_keys_109)
- [3.6 key属性](http://yehe.isd.com/column/support-plan/article-edit/6157566#36_key_111)
- [3.7 key\_len属性](http://yehe.isd.com/column/support-plan/article-edit/6157566#37_key_len_113)
- [3.8 ref属性](http://yehe.isd.com/column/support-plan/article-edit/6157566#38_ref_115)
- [3.9 rows属性](http://yehe.isd.com/column/support-plan/article-edit/6157566#39_rows_118)
- [3.10 Extra属性](http://yehe.isd.com/column/support-plan/article-edit/6157566#310_Extra_120)
- [四、案例学习](http://yehe.isd.com/column/support-plan/article-edit/6157566#_149)
执行计划(Explain):explain显示了mysql如何使用索引来处理select语句以及连接表,使用Explain关键字可以模拟MySQL优化器执行SQL查询语句,从而知道MySQL是如何处理SQL语句的。所以执行计划常用于SQL调优
Explain的用法:
mysql> explain select * from sys_user;
mysql> use jeeplatform;
Database changed
mysql> explain select * from sys_user;
+----+-------------+----------+------+---------------+------+---------+------+--
----+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | r
ows | Extra |
+----+-------------+----------+------+---------------+------+---------+------+--
----+-------+
| 1 | SIMPLE | sys_user | ALL | NULL | NULL | NULL | NULL |
4 | |
+----+-------------+----------+------+---------------+------+---------+------+--
----+-------+
1 row in set (0.00 sec)
mysql>
Explain的主要属性有id、select_type、table、type、possible_keys、key、key_len、ref、rows、Extra,如何对这些属性进行比较详细的介绍
执行计划(Explain)包括如下属性:
比较重要的属性有id、type、key、rows、Extra
id属性其实就是显示了SQL的执行顺序,下面分类解释
id相同的情况,执行顺序由上到下
本例子来自尚硅谷教程介绍,从执行计划可以看出就是t1>t3>t2,因为SQL有t1.other_column=''
的条件,所以先从t1开始执行,然后是t3,接着是t2
select_type就是查询的类型,用来区别普通查询、联合查询(union)、子查询等复杂查询,属性分为:
table属性,很显然这个属性就是显示查询数据是关于哪张表的
type属性表示MySQL找到数据行采取的方式,也称之为访问方式,显示了查询使用了何种类型
访问类型排序,从最好到最差的依次是(常用的): system>const>eq_ref>ref>range>index>All
来自尚硅谷老师的归纳:
然后介绍一下这些级别
备注:要保证sql查询,一般要达到range,或者ref级别
用于显示理论上扫描可能用到的索引
用于显示实践上用到的索引,返回null表示没用到索引
表示索引使用的字节数,key_len显示的是索引字段最大的可能长度,并非实际使用的长度
ref属性用于显示哪些常用或者列被用于查找索引,前提条件是走索引的
rows数据是根据统计信息及索引选用情况,大致估算出的记录数
Extra可以理解为拓展或者额外的属性,包含了不在其它属性的信息,但是十分重要的额外信息,常用于分析定位性能问题,比较重要的属性有Using filesort、using temporary、using index
如图来自尚硅谷视频的例子,这里就出现了Extra信息为using filesort,原因是where条件里用了col1,order by后面只用了col3,而复合索引是3个列都建的,所以导致不能用到索引排序,用了文件排序代替,解决方法是在order by加上col2
备注:索引的两大作用:排序和查询
上面例子,就是using temporary的情况,在group by后面加上col2列,使索引能用得上
覆盖索引(Covering index),一说索引覆盖,意思是查询时,数据只要从索引获取就可以(从叶子节点获取),不需要读取数据行 注意:查询时,要使用索引覆盖,就要select的列表只取需要的列就可以,不可以
select *
,如果将所有的字段一起做索引会导致索引文件过大,影响查询性能
尚硅谷教师的归纳